0

再会。需要监控键入的文本,即无击键,但即派生字符。

一开始我使用原始输入法获取按键的虚拟键码,但由于未能正确将虚拟键码转换为字符而不得不放弃这个决定。

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);

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

但是当我尝试在visual studio的编辑器中输入文本时,出现了问题:

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

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

提前致谢 )

4

1 回答 1

1

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

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

如果应用程序被编译为 Unicode 作为字符编码(即 MBCS 和 UNICODE 之间的区别),WM_CHAR 将仅是 UTF-16。如果您的应用程序是使用 MBCS(多字节字符集)构建的,那么系统将使用当前系统代码页将 Unicode 字符转换为“Ansi”(带引号)并发送。

因此,请检查您的构建设置,以便为您的应用配置的字符编码。

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

于 2012-08-23T15:35:19.713 回答