1.在dialog上放一个图片按件,用dialog的onkeyup直接进行快捷键捕获,会出现捕获不到的问题,原因是dialog上有控件,而onkeyup针对的dialog,所以无法捕获。解决方法如下:
(1)在pretranslateMessage中进行捕获,因为此函数是用来处理PostMessage和键盘/鼠标发出的消息;
(2)在新控件中加入消息处理,并在响应函数中进行消息处理。
2.PreTranslateMessage,PostMessage,SendMessage区别
PreTranslateMessage只能处理消息队列中的消息,也就是PostMessage发出的消息/鼠标键盘消息等。
SendMessage发的消息不进行消息队列,而是直接调用函数处理,所以这种消息用PreTranslateMessage捕获不到,如WM_KILLFOCUS,WM_SETFOCUS。
SendMessage的消息是直接执行处理函数,等消息处理完才返回(执行完SendMessage函数);而PostMessage则把消息发送后立即返回,把消息挂到消息队列等待处理。所以以下程序是错的:
#include<windows.h>
Int main()
{
PostMessage(HWND_BROADCAST,WM_QUIT,0,0);
Return 0;
}
PostMessage发出WM_QUIT消息到消息队列,由于它立即返回就执行下一条语句结束整个程序,消息还在消息队列中未处理出错!
3.程序示例:
BOOL CLineScanView::PreTranslateMessage(MSG*pMsg)
{
if (pMsg->message == WM_KEYUP)
{
switch(pMsg->wParam)
{
case VK_LEFT:
...
break;
case VK_RIGHT:
...
break;
case VK_SHIFT:
...
break;
case 'B':
...
break;
case 'J':
...
break;
default:
break;
}
}
return CFormView::PreTranslateMessage(pMsg);
}