C# SetWindowsHookEx()的回调过程是否可以包含对托管代码方法的调用?

C# SetWindowsHookEx()的回调过程是否可以包含对托管代码方法的调用?,c#,c++,.net,C#,C++,.net,我只在特定于线程的钩子上遇到这个问题WH_-KEYBOARD_-LL和WH_-MOUSE_-LL都可以正常工作,因为dll不必被注入到任何地方。这是构成dll的回调过程之一: LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { HookData[WH_KEYBOARD + 1].lpfn(nCode, wParam, lParam); return CallNextHookEx(Hook

我只在特定于线程的钩子上遇到这个问题
WH_-KEYBOARD_-LL
WH_-MOUSE_-LL
都可以正常工作,因为dll不必被注入到任何地方。这是构成dll的回调过程之一:

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    HookData[WH_KEYBOARD + 1].lpfn(nCode, wParam, lParam);
    return CallNextHookEx(HookData[WH_KEYBOARD + 1].hhook, nCode, wParam, lParam);
}
lpfn
是托管代码(C#project)中的方法,它将封送和存储参数以供进一步分析。当调用该方法时,我想要监视的线程进程崩溃,以防“访问冲突”(我用来测试钩子的线程是记事本窗口的线程)

我用这种方式试过,效果很好,每次我在记事本窗口对焦时按下一个键,就会显示一个消息框


那么,有没有一种方法可以调用该方法?或者我用错误的方式调用该方法?如果我不能调用该方法,是否有其他方法可以在每次调用回调过程时将回调参数传递给C#项目?

这是不可能的,指针仅在创建它们的过程中有效。由于您将DLL注入另一个进程,因此尝试取消对指针的引用总是会导致崩溃。您不能直接在另一个进程中调用方法,无论它是本机的还是托管的。谢谢您的回答,您确认了我所担心的。现在我想知道我是否可以在C#中实现一个特定于线程的钩子,我终于完成了我的目标。我没有传递回调方法的指针,而是在C#项目中使用GetMessage过程创建了一个线程,该线程将接收回调过程本身使用PostThreadMessage过程发送的回调参数。运行GetMessage的线程的线程id是通过读取我编写的线程id中的NamedPipe来获取的。到目前为止,我可以在多个线程中同时设置多个钩子,但我觉得这种方法太复杂了。
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    MessageBox(NULL, L"Value", L"KeyboardHook", MB_OK);
    return CallNextHookEx(HookData[WH_KEYBOARD + 1].hhook, nCode, wParam, lParam);
}