Windows键盘记录。各种应用程序中WM_CHAR消息的特征

时间:2012-08-23 06:01:06

标签: c++ windows hook keyboard-hook

美好的一天。需要监视键入的文本,即无键击,但是派生字符。

一开始我使用原始输入法获取按键的虚拟键码,但由于无法将虚拟键码正确转换为字符,因此必须放弃此决定。

MapVirtualKeyEx + LoadKeyboardLayout - 没有达到预期的效果,即如果通过调用LoadKeyboardLayout加载俄罗斯布局,那么MapVirtualKeyEx仍会返回拉丁语A代码0x41。

所以我开始使用钩子WM_GETMESSAGE。

if (nCode < 0)
    return CallNextHookEx(NULL, nCode, wParam, lParam);

// WH_GETMESSAGE
if (nCode == HC_ACTION)
{
    PMSG pMsg = (PMSG)lParam;
    if (pMsg != NULL)
    {
        if ((pMsg->message == WM_CHAR)||(pMsg->message == WM_UNICHAR))
        {
            keyEntry.character = pMsg->wParam;
            ipc->SendData(&keyEntry, sizeof(CHARENTRY));
        };
    };
};

return CallNextHookEx(NULL, nCode, wParam, lParam);

一切正常,包括带死键的角色。

但是当我尝试在视觉工作室的编辑器中输入文本时,出现了问题:

  • 对于一键按下两个相同的消息WM_CHAR;
  • 对于西里尔字符,值WM_CHAR-&gt;对于拉丁语,wParam与键入的字符不匹配 - 好吧。

如何将虚拟键码转换为字符,考虑键入文本的过程的输入语言+能够招募复合字符(例如:ô)。或者告诉我如何用钩子解决版本中的问题。

提前致谢)

1 个答案:

答案 0 :(得分:1)

当用户键入一个键时,键盘会生成两个扫描码 - 一个是用户按键时,另一个是当用户释放键时。

来源:关于键盘输入 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms646267(v=vs.85).aspx

如果应用程序是为Unicode编译的,那么WM_CHAR将只是UTF-16 字符编码(即MBCS和UNICODE之间的差异)。如果 你的应用程序是用MBCS(多字节字符集)构建的,然后是 系统将使用当前系统代码页来转换Unicode 字符“Ansi”(引号)并发送。

请检查您的构建设置,了解您的应用的字符编码 配置为。

来源:Unicode和多字节字符集(MBCS)支持:http://msdn.microsoft.com/en-us/library/ey142t48(v=vs.80).aspx