C#在不同线程中接收键盘钩子回调

C#在不同线程中接收键盘钩子回调,c#,multithreading,keyboard,hook,C#,Multithreading,Keyboard,Hook,我写了一个程序。它通过SetWindowsHookEx钩住用户输入。而且效果很好 MyInputHooker = new InputHooker(); MyInputHooker.StartInputHook(); 然后我想知道如何在不同的线程中实现WindowsHook,以便学习C 但我刚到C#,所以我找不到答案 帮帮我 谢谢 编辑 这是我的InputBook课程。有些代码是缩写的 public class InputHooker { public

我写了一个程序。它通过SetWindowsHookEx钩住用户输入。而且效果很好

        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
可能有点太高级了。使用它需要了解很多东西是如何在幕后工作的