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