C# SetWindowsHookEx失败,出现错误1428

C# SetWindowsHookEx失败,出现错误1428,c#,windows,setwindowshookex,C#,Windows,Setwindowshookex,我试图通过以下代码连接到start按钮 // Create an instance of HookProc. StartHookProcedure = new CallBack(StartHookProc); IntPtr desktop = FindWindowEx( IntPtr.Zero, IntPtr.Zero, "Progman", null); uint procId = 0; uint threadId = GetWindowThreadProc

我试图通过以下代码连接到start按钮

// Create an instance of HookProc.
StartHookProcedure = new CallBack(StartHookProc);
IntPtr desktop = FindWindowEx(
  IntPtr.Zero, IntPtr.Zero, "Progman", null);                
uint procId = 0;
uint threadId = GetWindowThreadProcessId(desktop, out procId);
Process process = Process.GetCurrentProcess();
ProcessModule module = process.MainModule;

IntPtr hModule = GetModuleHandle(null); // get my module handle...
//IntPtr start = FindWindowEx(desktop, IntPtr.Zero, "Button", null);

hHook = SetWindowsHookEx(WH_GETMESSAGE,
  StartHookProcedure, hModule, (int)threadId);
//If the SetWindowsHookEx function fails.
if (hHook == 0)
{
  int err = Marshal.GetLastWin32Error();
  MessageBox.Show("SetWindowsHookEx Failed" + err.ToString());
  return;
}
SetWindowHookEx总是遇到错误1428错误\u钩子\u需要\u HMOD

没有模块句柄,无法设置非本地挂钩


我不明白。虽然我正在调用
GetModuleHandle(null)

但它失败了。您无法按预期工作。模块句柄必须是DLL的句柄,您正在传递EXE的句柄。此外,DLL被注入到其他进程中。这意味着它不能是用C#编写的DLL,其他进程没有加载CLR。你必须用母语写一个,比如C。这里有一些指导:嘿,谢谢你的回答。是否可以使回调对clr应用程序可见?就像加载非托管dll、注入并指向clr应用程序中定义的回调一样?没有回调,您正在跨越进程边界。命名管道是常见的。阅读我链接的文章。