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

时间:2022-01-08 14:49:51

我们公司是做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);

}