再会。需要监控键入的文本,即无击键,但即派生字符。
一开始我使用原始输入法获取按键的虚拟键码,但由于未能正确将虚拟键码转换为字符而不得不放弃这个决定。
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 与键入的字符不匹配,对于拉丁语 - 好的。
考虑到文本输入过程的输入语言+能够招募复合字符(例如:ô),如何将虚拟键码转换为字符。或者告诉我如何用钩子解决版本中的问题。
提前致谢 )