0

在我的 C# 应用程序中,我想做 keyhook,但是,当按下键时调用的方法在另一个线程中调用。这样就不会发生我的程序省略一个键的情况,因为我的应用程序正忙于其他事情。我怎样才能使它在另一个线程中?我发现信息表明,根据我创建钩子的线程,按下键时调用的方法将在该线程中调用,但这不会发生。不管我在哪个线程中钩住它,这个方法总是在主线程中被调用。请帮忙。这是我的代码大纲:

int HookProc(int code, int wParam, ref lParamStruct lParam)
{
    // ... this should be invoked in another thread - thread th, which I use to call SetWindowsHook
}
void SetWindowsHook()
{
    lpMsg msg = new lpMsg();

    PeekMessage(out msg, new IntPtr(0), 0, 0, PM_NOREMOVE);

    hhook = SetWindowsHookEx(WH_KEYBOARD_LL, HookProc, new IntPtr(0), 0);

    while (GetMessage(out msg, new IntPtr(0), 0, 0))
    {
        DefWindowProc(msg.hwnd, msg.message, msg.wParam, msg.lParam);
        if (abortThreadFlag)
            break;

    }
    UnhookWindowsHookEx(hhook);
}

SetWindowsHook 是以这种方式调用的,但 id 不会强制在另一个线程中调用该方法:

 Thread th = new Thread(SetWindowsHook);
 th.Start()
4

1 回答 1

3

消息循环的重点是让 Windows 有机会调用您的挂钩过程。它没有其他方法可以调用您的代码。它不能闯入并强制你的线程运行代码,这会导致可怕的重入问题。挂钩过程只能在您的代码调用 GetMessage() 时运行。并将在该线程的上下文中运行。您可以通过查看 GetCurrentThreadId() 的返回值来验证这一点。

否则,使用线程无法解决慢速挂钩过程。在挂钩过程返回之前,Windows 不会分派任何其他输入事件。让它足够慢,Windows 将强行杀死钩子以恢复。考虑使用从线程安全队列中提供的工作线程,从而允许您的钩子过程快速返回。

于 2012-07-07T12:53:02.020 回答