windows - SendInput() 和非英文字符和键盘布局

标签 windows unicode keyboard-events keyboard-layout

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

这确实有效(当然,在我的代码中,我还在按下键后执行 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 字符,两者之一(重音字母等)。

提前致谢。

最佳答案

我发现正确的方法是通过对角色调用 VkKeyScanEx() 来获取角色的虚拟键码。返回值的高位字节将告诉您需要“按下”哪些修改键:Control、Alt 和/或 Shift;低位字节是实际的虚拟键代码。

获取VK的扫描码,调用MapVirtualKeyEx(vkCode, 0);

接下来就是用刚刚获得的信息进行按键模拟了。

关于windows - SendInput() 和非英文字符和键盘布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1970917/

相关文章:

html - 使用 UTF-8 时我应该对 HTML 特殊字符进行编码吗?

python - 如何在 Mac 上的 Python 中使用 CGEventCreateKeyboardEvent?

windows - Phonegap 从 Mac OSX 为 Windows Mobile 创建构建

windows - 伪造一个 RS232 串口

c++ - 如何在更改编译器/操作系统方面使 C++ 代码健壮

unicode - 所有 Unicode 左括号/右括号的列表

windows - 适用于 JavaScript 版本 2.1.30324.52 的适用于 Windows 库的 Visual Studio 扩展似乎停留在 "Configuring your system. This might take a while."

http - HTTP URI 可以包含非 ASCII 字符吗?

javascript - Angular 4专注于向下箭头上的元素并滚动

java - 如何在 Java Swing 中重新映射 NumLock 键?