似乎如果你在全局WH_KEYBOARD_LL钩子中调用ToAscii()或者ToUnicode()同时按下死键,它将被"销毁".
例如,假设您已将Windows中的输入语言配置为西班牙语,并且您希望在程序中键入带重音的字母á.通常情况下,您按下单引号键(死键),然后按字母"a",然后在屏幕上显示重音á,如预期的那样.
但是,如果您调用ToAscii()或ToUnicode()使用低级键盘挂钩功能,则此功能无效.看来,死键被破坏,所以没有重音字母á显示了在屏幕上.删除对上述函数的调用可以解决问题...但不幸的是,我需要能够调用这些函数.
我用谷歌搜索了一段时间,虽然很多人似乎都有这个问题,但没有提供好的解决方案.
任何帮助将非常感激!
编辑:我正在调用ToAscii()将我的LowLevelKeyboardProc钩子函数中收到的虚拟键代码和扫描代码转换为将在屏幕上显示给用户的结果字符.
我尝试过MapVirtualKey(kbHookData->vkCode, 2),但这并不像"完整"那样功能ToAscii(); 例如,如果你按Shift + 2,你将得到'2',而不是'@'(或者Shift + 2将为用户的键盘布局/语言产生).
ToAscii() 是完美的...直到按下死键.
EDIT2:这是钩子函数,删除了无关信息:
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); …Run Code Online (Sandbox Code Playgroud) 在 Windows 中使用非英语输入键盘语言时,我无法模拟字符按键。
我尝试使用 KEYEVENTF_UNICODE 调用 SendInput():
KEYBDINPUT ki;
INPUT input;
int character = 0;
ki.wVk = 0;
ki.wScan = character;
ki.dwFlags = KEYEVENTF_UNICODE;
ki.time = 0;
ki.dwExtraInfo = 0;
input.type = INPUT_KEYBOARD;
input.ki = ki;
SendInput(1, &input, sizeof(INPUT));
Run Code Online (Sandbox Code Playgroud)
这实际上有效(当然,在我的代码中,我也在按下键后执行 KEYUP)...除了在 GTK+ 应用程序中(可能还有其他情况下它也不起作用)。
根据MSDN,如果指定了 KEYEVENTF_UNICODE,SendInput 将 WM_KEYDOWN 或 WM_KEYUP 消息发送到前台线程的消息队列,wParam 等于 VK_PACKET。一旦 GetMessage 或 PeekMessage 获得此消息,将消息传递给 TranslateMessage 会发布一条 WM_CHAR 消息,其中包含最初由 wScan 指定的 Unicode 字符。如果将这个 Unicode 字符发送到 ANSI 窗口,它将自动转换为适当的 ANSI 值。
所以我相信当 KEYEVENTF_UNICODE 被传递时,SendInput() 的功能是不同的......不像通常那样低级。
在我的一生中,我想不出任何其他方法让 SendInput() 为用户的键盘语言正确打印字符。例如,如果键盘输入语言是“瑞典语”,我不能让它输出'@'(而是打印出一个引号),我不能让它正确输出非ASCII字符,要么(重音字母等)。 …
对于我的生活,我无法弄清楚在C中创建结构数组的正确语法.我试过这个:
struct foo {
int x;
int y;
} foo[][] = {
{
{ 1, 2 },
{ 4, 5 },
{ -1, -1 }
},
{
{ 55, 44 }
{ 100, 200 },
}
};
Run Code Online (Sandbox Code Playgroud)
所以例如foo [1] [0] .x == 100,foo [0] [1] .y == 5等等.但是GCC吐出了很多错误.
如果有人能提供合适的语法,那将是伟大的.
编辑:好的,我试过这个:
struct foo {
const char *x;
int y;
};
struct foo bar[2][] = {
{
{ "A", 1 },
{ "B", 2 },
{ NULL, -1 },
},
{ …Run Code Online (Sandbox Code Playgroud)