Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C#中的不同线程创建键盘挂钩?_C#_Keyboard Hook - Fatal编程技术网

如何使用C#中的不同线程创建键盘挂钩?

如何使用C#中的不同线程创建键盘挂钩?,c#,keyboard-hook,C#,Keyboard Hook,我正在使用SetWindowsHookEx在c#中创建一个低级键盘挂钩,问题是如何使键盘上的事件函数在主线程以外的线程上运行?此外,除了主线程之外,我目前没有其他线程,因此如何创建一个将暂停直到发生键盘挂钩事件的线程?以下是该线程的代码 您只需要调用Hook.CreateHook(METHODNAMEHERE);在新线程中(请参见线程类)。由于有一个关于如何在新线程上设置钩子的答案,这只回答了问题的第二部分: 如果您使用的是windows窗体应用程序,那么在使用附加线程时会遇到一些问题。他们需要

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

以下是该线程的代码


您只需要调用Hook.CreateHook(METHODNAMEHERE);在新线程中(请参见线程类)。

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

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

除此之外,启动“worker”线程,让它等待一些手动重置事件或自动重置事件。当键盘挂钩收到按键通知时,使用一些“共享”字段放置按键,然后重置事件,以便“等待”线程可以处理它


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

您的建议是在UI线程上运行一些事件处理…,我认为这不是一个好主意…已经有了一个解决方案,如何在单独的线程上设置钩子。我只是回答问题的第二部分,并指出在windows窗体应用程序中使用线程的一些复杂性。由于它不会触及窗体的控件,因此它是安全的,它所要做的唯一工作是设置键,并使另一个线程执行该工作,因此它不会造成任何伤害。如果新线程在Hook.CreateHook(METHODNAMEHERE)之后停止,会发生什么情况;?