C#在不同线程中接收键盘钩子回调
我写了一个程序。它通过SetWindowsHookEx钩住用户输入。而且效果很好C#在不同线程中接收键盘钩子回调,c#,multithreading,keyboard,hook,C#,Multithreading,Keyboard,Hook,我写了一个程序。它通过SetWindowsHookEx钩住用户输入。而且效果很好 MyInputHooker = new InputHooker(); MyInputHooker.StartInputHook(); 然后我想知道如何在不同的线程中实现WindowsHook,以便学习C 但我刚到C#,所以我找不到答案 帮帮我 谢谢 编辑 这是我的InputBook课程。有些代码是缩写的 public class InputHooker { public
MyInputHooker = new InputHooker();
MyInputHooker.StartInputHook();
然后我想知道如何在不同的线程中实现WindowsHook,以便学习C
但我刚到C#,所以我找不到答案
帮帮我
谢谢
编辑
这是我的InputBook课程。有些代码是缩写的
public class InputHooker
{
public delegate IntPtr inputHookedDelegate(int nCode, IntPtr wParam, IntPtr lParam);
public inputHookedDelegate keyHookHandler;
public InputHooker()
{
keyHookHandler = onKeyHooked;
}
public void StartInputHook()
{
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
curKeyHookID = SetWindowsHookEx(WH_KEYBOARD_LL, keyHookHandler, GetModuleHandle(curModule.ModuleName), 0);
}
}
private IntPtr onKeyHooked(int nCode, IntPtr wParam, IntPtr lParam)
{
return CallNextHookEx(curKeyHookID, nCode, wParam, lParam);
}
}
我试着像下面的代码一样
MyInputHooker = new InputHooker();
Thread myInputHookThread = new Thread(new ThreadStart(MyInputHooker.StartInputHook));
myInputHookThread.Name = "UOCInputHookThread";
myInputHookThread.Priority = ThreadPriority.Normal;
myInputHookThread.Start();
但它不起作用。(SetWindowsHookEx成功,但onKeyHooked没有在按下键盘时调用。)相反,下面的代码工作得非常好
MyInputHooker = new InputHooker();
MyInputHooker.StartInputHook();
失败的原因可以在以下WinAPI文档中找到: 这个钩子是在安装它的线程的上下文中调用的。 调用是通过向安装 钩子。因此,安装挂钩的螺纹必须具有 消息循环 发生的情况是,新创建的线程正在设置钩子并立即退出,因此当Windows希望通过向线程发送消息来调用钩子过程时,它找不到钩子过程,因为它已经退出 如果这只是为了学习,您可以通过调用
Application.Run
在StartInputHook
方法的末尾,在线程中添加消息泵。(至少我认为这会起作用——我自己还没有尝试过。)对于真正的代码,最好是在主应用程序线程中调用SetWindowsHookEx
。我假设您已经在这种情况下这样做了,并且应用程序的消息泵正在为您处理这个问题
老实说,如果这只是为了学习C#,SetWindowsHookEx
可能有点太高级了。使用它需要了解很多东西是如何在幕后工作的