【问题标题】:Respond to keyboard when not in focus? (C#, Vista)不在焦点时响应键盘? (C#,Vista)
【发布时间】:2010-10-06 07:15:44
【问题描述】:

我正在尝试编写一个在按下 Shift 键时响应的应用程序,无论当前哪个应用程序具有焦点。

我用SetWindowsHookEx()GetKeyboardState() 试过这个,但是这两个都只在应用程序的窗口有焦点时才有效。我需要它在全球范围内工作。

我该怎么做?

【问题讨论】:

    标签: c# windows windows-vista


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      您必须使用 SetWindowsHookEx()。只有两种类型的钩子可以在托管语言中实现,WH_KEYBOARD_LL 和 WH_MOUSE_LL。所有其他钩子都需要一个可以注入另一个进程的 DLL。无法注入托管 DLL,无法初始化 CLR。​​

      这个blog post 有一个功能示例。

      【讨论】:

      • 大多数其他钩子也可以用托管语言实现,但前提是它们仅限于当前进程的线程。低级鼠标和键盘挂钩是唯一允许的“全局”挂钩。
      • 这只是掠过问题的表面,并没有真正深入到任何深度。
      • 这是对具体问题的非常具体的回答。它有点短,为了简单起见,省略了一些信息,但它包含了有能力的软件开发人员需要的所有信息。
      【解决方案3】:

      如果您在 nobugz 引用的帖子中使用该技术,则需要确保委托不会被垃圾收集,例如通过在设置钩子时使用 GC.KeepAlive(_proc) ,否则在不确定的时间段后,当 delagate 被 GCed 时钩子将停止工作。

      【讨论】:

        【解决方案4】:

        提供的答案都没有帮助我解决我的问题,但我自己找到了答案。在这里。

        使用SetWindowsHookEx()WH_KEYBOARD_LL 是正确的方法。但是,SetWindowsHookEx() 的其他参数并不直观:

        • 最后一个参数dwThreadId需要为0。
        • 倒数第二个参数hMod 需要指向某个DLL。我用了 User32,这是一个总是被加载并被所有人使用的 DLL 带有 GUI 的进程。我从a CodeProject post about this 得到这个想法。

        因此,代码看起来有点像这样:

        instance = LoadLibrary("User32");
        hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookFunction, instance, 0);
        

        文档不清楚倒数第二个参数。它说:

        hMod 参数必须设置为 NULL [...] 如果挂钩过程在与当前进程关联的代码中。

        它并没有说明这只适用于某些类型的钩子,但不适用于WH_KEYBOARD_LLWH_MOUSE_LL

        【讨论】:

        • 是的,这就是他们的意思——对于低级鼠标或键盘挂钩(或任何其他本地挂钩),hMod 应该是 IntPtr.Zero。
        • 嗯,您说其他帖子没有帮助,然后继续发布 nobugz 已经提供的相同答案并将您的答案标记为正确答案。
        • Nobugz 根本没有说明如何处理 hMod,并且与您的第一条评论相反,此答案建议将 hMod 设置为 other 而不是 IntPtr.Zero。
        • 斯蒂芬·马丁,不管你认为文档作者的意思是什么,也不管你认为 nobugz 是什么意思或不是什么意思,事实是我的解决方案解决了我的问题,而他没有.
        • Nobugz 没有对键盘钩子做任何补充,因为它是不必要的,它在文档和链接的博客文章中有完整的介绍。这篇文章及其链接的文章关于 hMod 的内容不正确,它应该为 NULL。该参数当前被操作系统忽略...
        猜你喜欢
        • 1970-01-01
        • 2018-09-08
        • 1970-01-01
        • 1970-01-01
        • 2011-11-28
        • 2019-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多