MFC对话框里不能响应按键事件的解决办法

我们公司是做IP电话的。有一个以前做好的模拟话机的的软件。上面有好多按钮(仿真真实话机的)。每次测试软件要点击好多次按钮。听说是用鼠标多了手会残疾。所以打算用键盘的按键代替模拟电话上的按钮。

按道理说只要在窗口上映射键盘消息就行了。

按键消息响应的函数有:

    afx_msg void OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags);
    afx_msg void OnKeyUp (UINT nChar, UINT nRepCnt, UINT nFlags);
    afx_msg void OnSysKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags);
    afx_msg void OnSysKeyUp (UINT nChar, UINT nRepCnt, UINT nFlags);
    afx_msg void OnChar (UINT nChar, UINT nRepCnt, UINT nFlags);


BEGIN_MESSAGE_MAP (CMainWindow, CWnd)
   
    ON_WM_KEYDOWN ()
    ON_WM_KEYUP ()
    ON_WM_SYSKEYDOWN ()
    ON_WM_SYSKEYUP ()
    ON_WM_CHAR ()
    ON_WM_SYSCHAR ()
END_MESSAGE_MAP ()


以上所有消息都试过,但是就是没有路由的消息处理函数。



最后发现窗口的焦点在按钮上。


因此要自己拦截一下,不然都路由到按钮上去了。


拦截消息就是要实现窗口的一个虚函数。

PreTranslateMessage(MSG* pMsg)


具体做法:

在你的窗口那个类的声明时添加一个虚函数:virtual BOOL PreTranslateMessage(MSG* pMsg);

在.cpp 中实现它就行了。

格式:

    if( pMsg->message == WM_KEYDOWN )
    {
        switch( pMsg->wParam )
        {
           case VK_NUMPAD0:
   
              break;
           case VK_NUMPAD1:

              break;

       }

    return CDialog::PreTranslateMessage(pMsg);

}
  


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值