使用MFC 发送消息模拟按钮按下事件

有时我们需要这么做, 手动模拟按钮按下的事件, 让程序做出与按钮真的按下时一样的响应.

   设按钮ID为ID_BTN_OK, 当前Dialog窗口.
   实际上系统并不能区分按钮是真的按下了(如用鼠标点击), 还是一个我们自己用代码模拟出的一种"假象".
它所需要知道的只是哪个窗口(按钮也是一种窗口)发生了哪一种事件, 然后在消息循环中处理它. 系统怎么才
能知道这些呢? 当然靠的是消息(message), 我们只需按照Windows或者MFC的标准格式把相应的信息传给系统,
系统就会"上当"了.
   向系统传递消息可以用SendMessage或PostMessage(可能还有其他很多函数哦), 但SendMessage执行后系统
会一直等待, 直到要发送的消息被处理掉. 而PostMessage可不管那么多, 发送消息后立即返回程序流程. 当
按钮按下的响应函数中有很大一个循环时, 用SendMessage会出现许多问题, 尤其是要在程序初始化阶段模拟时,
会导致窗体无法完成初始化. 所以我们用PostMessage(). 它的原型为:
  1. BOOL PostMessage(          HWND hWnd,
  2.     UINT Msg,
  3.     WPARAM wParam,
  4.     LPARAM lParam
  5. );
   这样写;   
  1. PostMessage(WM_COMMAND, MAKEWPARAM(ID_BTN_OK, BN_CLICKED), NULL);
  这里, WM_COMMAND是要发送的消息, MAKEWPARAM宏是为了组成一个WPARAM,WM_COMMAND消息的WPARAM的低字为控件ID,高字为识别码, 最后一个参数LPARAM可为NULL.相关定义可查看MSDN.
  这样我们就把必需的信息格式化好发送给系统了. 当系统在消息循环中收到该消息时, 就知道哦, 你要引发控件ID_BTN_OK
的事件BN_CLICKED, 好的我帮你处理. 于是我们就惊喜地看到按钮看起来真的按下去了, 并执行了和真正按下去时一样的代码.

 

看评论说不管用,我又试验了一下。新建一个对话框工程,在对话框上添加一个按钮,ID为IDC_BTN_TEST,单击它,为它添加ON_BN_CLICKED消息响应函数:
  1. void CtestDlg::OnBnClickedBtnTest()  
  2. {  
  3.     AfxMessageBox(_T("OK"));  
  4. }  
 
然后在对话框的OnInitDialog()函数的return TRUE前加上:
  1. PostMessage(WM_COMMAND, MAKEWPARAM(IDC_BTN_TEST, BN_CLICKED), NULL);  
 
好了,再运行程序,会弹出个消息框 “OK”,说明模拟正确。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值