我正在开发一个需要logging和回放击键的程序。 主进程作为一个服务来运行,所以它需要一个configuration程序来logging击键。
当系统默认的键盘布局是(比如)英语,并且用户的键盘布局是德语时,问题就出现了。 用户在configuration界面input“ü”字符,并进行正确的logging和存储。
现在,用户运行记事本并尝试重新播放按键,这是由服务的子节点完成的。 当转换input传递给SendInput
,我们调用VkKeyScan
,然后告诉我们没有办法在这个键盘上重现那个字符(记住默认的键盘布局是英文的)。
我真正想做的是同步服务的键盘布局和当前的前台应用程序,这样服务可以重现用户可以用键盘input的任何字符。 GetKeyboardLayout
只能在当前进程中运行。 这必须在32位和64位上运行,所以消息钩是…不是首选:)。
检索前景窗口的键盘布局:
GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL))
这听起来像是在录制字符而不是按键。 您可以使用SendMessage发送WM_CHAR消息与记录的字符,而不是生成击键,而不是发送键击时,而不是生成击键?