【发布时间】:2009-12-28 18:45:50
【问题描述】:
当在 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 字符,要么(重音字母等)。
提前致谢。
【问题讨论】:
-
这是什么,C? C++? C#?
-
@Carl:我使用的是 C,尽管任何语言的任何示例——只要它使用 Win32 API 调用——都会有所帮助。
标签: windows unicode keyboard-events keyboard-layout