Windows 如何检查消息WM_KEYDOWN是否可以在WM_KEYDOWN处理程序中转换为消息WM_CHAR?
我正在开发一个功能,我需要检查消息WM_KEYDOWN是否可以翻译成WM_CHAR。如果是,我需要将字符(由WM_KEYDOWN翻译)发送到WM_字符处理程序中的另一个进程;否则,我需要将密钥扫描代码发送到WM_KEYDOWN处理程序中的另一个进程。 事实上,我找到了一个解决方案: 请参阅MSDN中的TranslateMessage说明: 将虚拟密钥消息转换为字符消息。字符消息被发布到调用线程的消息队列中,以便在线程下次调用GetMessage或PeekMessage函数时读取 从上面的文本中,如果WM_KEYDOWN可以转换为WM_CHAR消息,那么调用WM_KEYDOWN处理程序时,消息WM_CHAR将已经在线程消息队列中。 这意味着我可以在WM_KEYDOWN处理程序中调用peek消息,并检查消息是否为WM_CHAR。如果是,我不应该在WM_KEYDOWN处理程序中执行任何操作,而是应该在WM_char处理程序中发送char;否则,我应该在WM_KEYDOWN处理程序中发送扫描代码。我的代码:Windows 如何检查消息WM_KEYDOWN是否可以在WM_KEYDOWN处理程序中转换为消息WM_CHAR?,windows,visual-c++,keyboard,Windows,Visual C++,Keyboard,我正在开发一个功能,我需要检查消息WM_KEYDOWN是否可以翻译成WM_CHAR。如果是,我需要将字符(由WM_KEYDOWN翻译)发送到WM_字符处理程序中的另一个进程;否则,我需要将密钥扫描代码发送到WM_KEYDOWN处理程序中的另一个进程。 事实上,我找到了一个解决方案: 请参阅MSDN中的TranslateMessage说明: 将虚拟密钥消息转换为字符消息。字符消息被发布到调用线程的消息队列中,以便在线程下次调用GetMessage或PeekMessage函数时读取 从上面的文本中,
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;
}
我在本地机器上测试了一些案例。但我认为这个解决方案太棘手了。有什么共同的解决办法吗?
谢谢 你可以试试ToUnicodeEx()。请注意,这永远不会完全可靠,键盘状态是每线程属性。为什么不在
WM_KEYDOWN
到达时发送扫描代码,然后在WM_CHAR
稍后到达时也发送字符代码?你真的需要向前看吗?谢谢你的评论,伊戈尔。原因是它将生成重复的字符。例如,按下“a”键将生成两条消息:WM_KEYDOWN和WM_CHAR。如果我在WM_KEYDOWN处理程序和unicode WM_CHAR处理程序中发送两个扫描代码,它将在远程应用程序中生成两个字符“a”。您好,这是一个旧线程,但您是否找到了满意的问题解决方案?