Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何检查消息WM_KEYDOWN是否可以在WM_KEYDOWN处理程序中转换为消息WM_CHAR?_Windows_Visual C++_Keyboard - Fatal编程技术网

Windows 如何检查消息WM_KEYDOWN是否可以在WM_KEYDOWN处理程序中转换为消息WM_CHAR?

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函数时读取 从上面的文本中,

我正在开发一个功能,我需要检查消息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处理程序中发送扫描代码。我的代码:

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”。您好,这是一个旧线程,但您是否找到了满意的问题解决方案?