【问题标题】:How to determine the keyboard layout for another process (Windows)?如何确定另一个进程(Windows)的键盘布局?
【发布时间】:2009-05-29 00:19:30
【问题描述】:

我正在开发一个需要记录和回放击键的程序。主进程作为服务运行,因此需要一个配置程序来记录击键。

当系统默认键盘布局是(比如说)英语,而用户当前的键盘布局是(比如说)德语时,就会出现问题。用户在配置界面中输入一个'ü'字符,该字符被及时记录和存储。

现在用户运行记事本并尝试播放击键,这是由服务的子项完成的。在将输入转换为传递给SendInput 时,我们调用VkKeyScan,然后告诉我们无法在此键盘上重现该字符(请记住默认键盘布局是英文)。

我真正想做的是同步服务的键盘布局和当前的前台应用程序,以便服务可以重现用户可以使用键盘的任何字符。 GetKeyboardLayout 仅适用于当前进程。这必须在 32 位和 64 位上运行,因此消息挂钩是...不是首选:)。

【问题讨论】:

    标签: windows keyboard-layout


    【解决方案1】:

    检索前台窗口的键盘布局:

    GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL))
    

    听起来您正在录制字符而不是击键。重放时不发送击键,是否可以使用 SendMessage 发送带有录制字符的 WM_CHAR 消息而不是生成击键?

    【讨论】:

    • 这在服务中不起作用(嗯。它可以在交互式服务中起作用,但不建议使用交互式服务,并且在较新版本的 Windows 下不起作用)。
    • 我不知道为什么我没有想到这一点。 @jdigital,它实际上会起作用,因为该服务在用户会话中有一个工作进程。谢谢!
    猜你喜欢
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 2020-08-02
    • 2010-09-28
    • 1970-01-01
    • 2010-09-20
    • 2017-12-04
    相关资源
    最近更新 更多