妖哥,热键处理消息 中加载组件的事件 编译不通过,请赐教!
各位大虾们,我做了一个全局热键,然后想在热键里面尝试加载一个按钮组件的事件,但是编译不通过,不知道是什么原因,请大侠们赐教!
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{ //注册系统热键
if(!RegisterHotKey(Handle,2000,MOD_CONTROL,VK_F1))
//这里注册的热键是Ctrl+F1
ShowMessage("热键注册失败");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
UnregisterHotKey(Handle, 2000);//退出程序时注销热键
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnHotKey(TMessage &Message)
{
TForm::Dispatch(&Message);
Form1->BitBtn1Click(Sender); //进入窗口中的按钮事件(编译出错)
MessageBox(Handle,"这是通过系统热键产生的信息!","信息提示",MB_OK);
}
[解决办法]
提示不是很清楚了么,没有 Sender 这个变量,在你的程序上下文中也没有这个变量。
改成
Form1->BitBtn1->Click();
[解决办法]
哪来“Sender不是模拟鼠标点击动作的变量的么” 这种说法
你得先搞清楚Windows 的消息机制这些基本原理,不然只能纠结在这个Sender上
你要么 Form1->BitBtn1->Click();
要么 Form1->BitBtn1Click(BitBtn1);
[解决办法]
也可以通过发消息
PostMessage(btn1->Handle,WM_LBUTTONDOWN, MK_LBUTTON, 0);
PostMessage(btn1->Handle,WM_LBUTTONUP, MK_LBUTTON, 0);
[解决办法]
你要是懒得一页书都不想看,那就只能在门外慢慢煎熬了
我就简单说两句
// 如果收到点击消息,这个 btn1Click 函数将被调用,
// btn1Click 函数就是系统收到某个消息后用来响应消息处理的回调函数
void __fastcall TForm1::btn1Click(TObject *Sender)
{
/*
Sender 顾名思义,表示一个消息的发送方,这是个Sender的类型是
VCL 的根 TObject(所有VCL对象的基类),然后将这个TObject类型转为
某个具体的类型(用 dynamic_cast 操作符进行转换)
btn1Click 函数的形参Sender被声明为TObject类型是为了方便,TObject是所有类型的基类,
这样就不用为每一种回调函数(事件处理函数)的参数声明各种类型:
label1Click(TLabel* sender)
formCreate(TForm1* sender)
...
上面的可以统一改为 CtrolEvent(TObject* sender)
具体中转为期望的类型就可以了 */
TWinControl* ctrl; // TWinControl 类是所有可视化控件的基类,TButton也是其派生类
ctrl = dynamic_cast<TWinControl*>(Sender);
// TWinControl 有个 Name 属性,所有控件都继承了这个属性,TButton当然也有
if (ctrl) ShowMessage("点击了控件:" + ctrl->Name);
}
//---------------------------------------------------------------------------
// 模拟点击 btn1
void __fastcall TForm1::btn2Click(TObject *Sender)
{
/* WM_LBUTTONDOWN 消息表示鼠标左键按下,
WParam 为 MK_LBUTTON ,表示按下的是左键
LParam 表示发生点击的坐标点,这里不需要,暂为0 */
PostMessage(btn1->Handle,WM_LBUTTONDOWN, MK_LBUTTON, 0);
// WM_LBUTTONUP 表示按键弹起,按下->弹起 表示了一个 Click 动作
PostMessage(btn1->Handle,WM_LBUTTONUP, MK_LBUTTON, 0);
/* VCL 对各种消息响应进一步细化,包装为各种事件处理函数,
如果是 OnClick 目的是只要知道是一个左键点击就可以了,至于点击的坐标点在哪之类的不管.
如果是 OnKeyDown 则要关心更多的细节,比如要知道按下的左键、右键还是中间,和按下的坐标位置 */
}