我正在制作一个需要录制和播放击键的程序。主进程作为服务运行,因此需要一个配置程序来记录击键。
当系统默认键盘布局是(比如说)英语时,问题出现了,当前用户的键盘布局是(比方说)德语。用户在配置界面中输入“ü”字符,并将其妥善记录并存储。
现在用户运行记事本并尝试回击键,这是由服务的孩子完成的。转换输入以传递给SendInput
时,我们调用VkKeyScan
,然后告诉我们无法在此键盘上重现该字符(请记住默认键盘布局为英语)。
我真正想做的是同步服务的键盘布局和当前的前台应用程序,这样服务就可以重现用户可以用键盘输入的任何字符。 GetKeyboardLayout
仅适用于当前流程。这必须在32位和64位上运行,因此消息挂钩是......不是首选:)。
答案 0 :(得分:5)
检索前景窗口的键盘布局:
GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL))
这听起来像是在录制字符而不是按键。您可以使用SendMessage发送带有记录字符的WM_CHAR消息而不是生成击键,而不是在重放时发送击键吗?