如何检查消息WM_KEYDOWN可以在WM_KEYDOWN处理程序中转换成WM_CHAR消息吗?

时间:2014-09-25 09:33:10

标签: windows visual-c++ keyboard

我正在研究一项功能,我需要检查消息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;
}

我在本地机器上测试了一些情况。但我认为这个解决方案太棘手了。有什么共同的解决方案吗? 欣赏!

0 个答案:

没有答案