我正在研究一项功能,我需要检查消息WM_KEYDOWN是否可以转换为WM_CHAR。如果是,我需要将char(由WM_KEYDOWN翻译)发送到WM_CHAR处理程序中的另一个进程;否则,我需要将密钥扫描代码发送到WM_KEYDOWN处理程序中的另一个进程。 实际上,我找到了一个解决方案: 请参阅MSDN中的TranslateMessage说明: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644955(v=vs.85).aspx 将虚拟密钥消息转换为字符消息。字符消息被发布到调用线程的消息队列,以便在线程下次调用GetMessage或PeekMessage函数时读取。
从上面的文本中,如果WM_KEYDOWN可以转换为WM_CHAR消息,则在调用WM_KEYDOWN处理程序时,消息WM_CHAR将在线程消息队列中。 这意味着我可以在WM_KEYDOWN处理程序中调用PeekMessage并检查消息是否为WM_CHAR。如果是,我应该在WM_KEYDOWN处理程序中什么也不做,并在WM_CHAR处理程序中发送char;否则,我应该在WM_KEYDOWN处理程序中发送扫描代码。我的代码:
MSG_WM_KEYDOWN(OnKeyMessage)
MSG_WM_SYSKEYDOWN(OnKeyMessage)
MSG_WM_KEYUP(OnKeyMessage)
MSG_WM_SYSKEYUP(OnKeyMessage)
MESSAGE_HANDLER_EX(WM_CHAR, OnChar)
void
MyWindow::OnKeyMessage(UINT nChar, // IN: VK_* code
UINT nRepCnt, // IN
UINT nFlags) // IN
{
MSG msg;
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
if (msg.message == WM_CHAR) {
return;
} else {
...
/* Send scan code */
...
}
}
LRESULT
MyWindow::OnChar(UINT uMsg, // IN
WPARAM wParam, // IN
LPARAM lParam) // IN
{
...
/* Send the char (UINT)wParam */
...
return 0;
}
我在本地机器上测试了一些情况。但我认为这个解决方案太棘手了。有什么共同的解决方案吗? 欣赏!