【问题标题】:How do I create a keyboard hook with a different thread in C#?如何在 C# 中创建具有不同线程的键盘挂钩?
【发布时间】:2008-10-07 13:38:32
【问题描述】:

我正在使用 SetWindowsHookEx 在 c# 中创建一个低级键盘挂钩,问题是如何使键盘事件函数在主线程以外的线程上运行?另外我目前除了主线程之外没有其他线程,那么如何创建一个在键盘钩子事件发生之前会停止的线程?

【问题讨论】:

    标签: c# keyboard-hook


    【解决方案1】:

    这是C# Keyboard hook的代码。

    你只需要调用 Hook.CreateHook(METHODNAMEHERE);在一个新的 Thread 中(参见 Thread 类)。

    【讨论】:

    • 如果新线程在 Hook.CreateHook(METHODNAMEHERE); 之后停止会发生什么?
    【解决方案2】:

    由于有一个如何在新线程上设置钩子的答案,这仅回答了问题的第二部分:

    如果您使用的是 Windows 窗体应用程序,则在使用附加线程时会遇到一些问题。他们需要使用 Control.Invoke 与表单控件进行通信。

    除此之外,启动您的“工作”线程,并使其等待某个 ManualResetEvent 或 AutoResetEvent。当您的键盘挂钩收到按键通知时,使用一些“共享”字段来放置按键,然后重置事件,以便“等待”线程可以处理它。

    不要忘记在“共享”字段周围实施适当的锁定。

    【讨论】:

    • 您的提议提议在 UI 线程上运行一些事件处理...,我认为这不是一个好主意...
    • 已经有了如何在单独的线程上设置挂钩的答案。我只是回答问题的第二部分,并指出在 Windows 窗体应用程序中使用线程的一些复杂性。
    • 所以,在 UI 线程上设置钩子。因为它不会接触到表单的控件,所以是安全的,它唯一要做的就是设置key,让其他线程来做,所以不会有坏处。
    猜你喜欢
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多