美好的一天。需要监视键入的文本,即无键击,但是派生字符。
一开始我使用原始输入法获取按键的虚拟键码,但由于无法将虚拟键码正确转换为字符,因此必须放弃此决定。
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);
一切正常,包括带死键的角色。
但是当我尝试在视觉工作室的编辑器中输入文本时,出现了问题:
如何将虚拟键码转换为字符,考虑键入文本的过程的输入语言+能够招募复合字符(例如:ô)。或者告诉我如何用钩子解决版本中的问题。
提前致谢)
答案 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