- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
似乎如果您在全局 WH_KEYBOARD_LL Hook 中调用 ToAscii()
或 ToUnicode()
,并且按下死键,它将被“销毁” '.
例如,假设您在 Windows 中将输入语言配置为西类牙语,并且您想要在程序中键入带重音符号的字母 á。通常,您会按单引号键(死键),然后按字母“a”,然后屏幕上会按预期显示带重音符号的 á。
但是,如果您在低级键盘 Hook 函数中调用 ToAscii()
或 ToUnicode()
,这将不起作用。似乎死键被破坏了,所以屏幕上没有显示重音字母 á 。删除对上述函数的调用可以解决问题...但不幸的是,我需要能够调用这些函数。
Google 了一会儿,似乎很多人都有这个问题,但没有提供好的解决方案。
如有任何帮助,我们将不胜感激!
编辑: 我正在调用 ToAscii()
来转换我的 LowLevelKeyboardProc 中收到的虚拟键码和扫描码将函数挂接到将在屏幕上为用户显示的结果字符。
我尝试了 MapVirtualKey(kbHookData->vkCode, 2)
,但这不是像 ToAscii()
那样“完整”的函数;例如,如果您按 Shift + 2,您将得到“2”,而不是“@”(或者任何 Shift + 2 将为用户的键盘布局/语言生成)。
ToAscii()
是完美的……直到按下死键。
EDIT2:这是钩子(Hook)函数,删除了不相关的信息:
LRESULT CALLBACK keyboard_LL_hook_func(int code, WPARAM wParam, LPARAM lParam) {
LPKBDLLHOOKSTRUCT kbHookData = (LPKBDLLHOOKSTRUCT)lParam;
BYTE keyboard_state[256];
if (code < 0) {
return CallNextHookEx(keyHook, code, wParam, lParam);
}
WORD wCharacter = 0;
GetKeyboardState(&keyboard_state);
int ta = ToAscii((UINT)kbHookData->vkCode, kbHookData->scanCode,
keyboard_state, &wCharacter, 0);
/* If ta == -1, a dead-key was pressed. The dead-key will be "destroyed"
* and you'll no longer be able to create any accented characters. Remove
* the call to ToAscii() above, and you can then create accented characters. */
return CallNextHookEx(keyHook, code, wParam, lParam);
}
最佳答案
很老的话题了。不幸的是,它没有包含我正在寻找的答案,而且似乎没有一个答案能正常工作。我终于通过检查 MSB 解决了问题MapVirtualKey
函数,在调用 ToUnicode
/ToAscii
之前。似乎很有魅力:
if(!(MapVirtualKey(kbHookData->vkCode, MAPVK_VK_TO_CHAR)>>(sizeof(UINT)*8-1) & 1)) {
ToAscii((UINT)kbHookData->vkCode, kbHookData->scanCode,
keyboard_state, &wCharacter, 0);
}
在 MapVirtualKey
的返回值上引用 MSDN,如果使用 MAPVK_VK_TO_CHAR
:
[...] Dead keys (diacritics) are indicated by setting the top bit of the return value. [...]
关于windows - 键盘 Hook 中的 ToAscii/ToUnicode 会破坏死键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1964614/
我试着调用 ToUnicode在低级键盘钩子(Hook)中并打印它返回的字符。但是,该函数似乎没有考虑是否按下了特殊键,例如 shift 或 caps lock,因此输出与 MapVirtualKey
类似的问题已经被问到,所以我不打算浪费时间重新解释它,现有的讨论可以在这里找到: ToAscii/ToUnicode in a keyboard hook destroys dead keys 然而,
这个问题在这里已经有了答案: When and why will a compiler initialise memory to 0xCD, 0xDD, etc. on malloc/free/ne
我正在尝试使用 ToUnicode响应接收到 WM_KEYDOWN 的函数通知,这听起来比它容易得多。 实际上,ToUnicode如果一个人简单地使用 WM_CHAR 应该是多余的,但令我惊讶的是,这
我正在解析一个 PDF 文件并提取一些文本,我遇到了一个名为“C2_0”的字体字典,其中包含一个带有 ToUnicode 的 CIDFont(类型 0) CMap。所以,没问题 - 我有工具来解析 T
我正在尝试使用 PDFMiner 从外语 PDF 文件中提取文本,但被 ToUnicode 语句挫败。即使在普通的 PDF 查看器下,该文件的行为也很奇怪。 例如,这是文件中某些文本的屏幕截图: 但是
首先,请原谅我糟糕的英语;) 我想使用 Windows 函数 ToUnicode (http://msdn.microsoft.com/en-us/library/windows/desktop/ms
Win32 函数 ToUnicode()/ToAscii() 可以输出的最大字符数是多少? 在给定虚拟键码、扫描键码和键盘状态的情况下,它可以输出的内容肯定有一个合理的上限吗? 最佳答案 在我的 Wi
到UnicodeEx: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646322(v=vs.85).aspx 到Unicode:
似乎如果您在全局 WH_KEYBOARD_LL Hook 中调用 ToAscii() 或 ToUnicode(),并且按下死键,它将被“销毁” '. 例如,假设您在 Windows 中将输入语言配置为
我使用 qpdf 解压缩了一个 PDF 文件,下面是输出。您可以看到 encoding 和 ToUnicode 都存在。如果只有 ToUnicode,我知道如何使用 Cmap 文件映射单个字符。但是,
我是一名优秀的程序员,十分优秀!