C#SetWinEventHook失败(返回0)

C#SetWinEventHook失败(返回0),c#,pinvoke,C#,Pinvoke,对于我正在制作的应用程序,我希望截获来自外部进程的窗口消息(很像spy++的方式)。我想我可以用SetWinEventHook来做这个。 这是我的密码 类程序 { 内部委托void WinEventProc(IntPtr hwinethook、intievent、IntPtr hWnd、intidobject、intidchild、intdweventthread、intdwmseventtime); [DllImport(“user32.dll”,SetLastError=true)] 内部静

对于我正在制作的应用程序,我希望截获来自外部进程的窗口消息(很像spy++的方式)。我想我可以用SetWinEventHook来做这个。 这是我的密码

类程序
{
内部委托void WinEventProc(IntPtr hwinethook、intievent、IntPtr hWnd、intidobject、intidchild、intdweventthread、intdwmseventtime);
[DllImport(“user32.dll”,SetLastError=true)]
内部静态外部IntPtr SetWinEventHook(inteventmin、inteventmax、IntPtr hmodWinEventProc、WinEventProc lpfnWinEventProc、intidprocess、intidthread、SetWinEventHookFlags dwflags);
//[DllImport(“user32.dll”,SetLastError=true)]
内部静态外部内部非钩线事件(IntPtr hWinEventHook);
内部枚举SetWinEventHookFlags
{
WINEVENT_INCONTEXT=4,
WINEVENT_OUTOFCONTEXT=0,
WINEVENT_SKIPOWNPROCESS=2,
WINEVENT_SKIPOWNTHREAD=1
} 
静态void Main(字符串[]参数)
{
int threadId=0x000306D4;
int processId=0x000306BC;
WinEventProc侦听器=新建WinEventProc(EventCallback);
//设置窗口挂钩并将结果写入控制台
Console.WriteLine(SetWinEventHook(1,0x7fffffff,IntPtr.Zero,侦听器,processId,threadId,SetWinEventHookFlags.WINEVENT_INCONTEXT).ToString());
控制台。写入线(“完成”);
Console.ReadKey();
}
私有静态void事件回调(IntPtr hWinEventHook、intievent、IntPtr hWnd、intidobject、intidchild、intdweventthread、intdwmseventtime)
{
//回调函数,在截获消息时调用
Console.WriteLine(hWnd.ToString());
}
}
}

据我所知,我使用的是正确的p/Invoke声明,但当我运行此代码时,输出是:

0 done 0 完成 如果成功,它应该返回一个标识此事件挂钩实例的HWINEVENTHOOK值。如果未成功,则返回0。(至少根据微软网站) 线程和进程似乎都有效且正在运行

有谁能帮我更接近我的问题所在吗?我想这一定是一些小事情,或者我只是用了完全错误的方法去做我想做的事情。提前感谢。

根据

对于上下文外事件,该事件在调用SetWinEventHook的同一线程上传递

我在一个控制台应用程序中尝试了你的例子,正如你提到的,没有收到任何事件。但在winform上,该示例起作用,事件被接收。所以,我认为,这是因为控制台应用程序中的单线程执行


将SetWinEventHook调用放入按钮单击事件中,您应该开始在回调中接收事件。

这一点有点不同:

调用SetWinEventHook的客户端线程必须具有消息循环才能接收事件

()

在控制台应用程序中没有消息循环,在winform应用程序中有一个。
这就是为什么你不能在控制台应用程序中获取事件。

我发现部分问题在于,应该使用SetWinEventHookFlags.WINEVENT\u OUTOFCONTEXT而不是SetWinEventHookFlags.WINEVENT\u INCONTEXT。否则,它希望我提供一个dll,在其中它可以找到“上下文”,但仍然没有捕获窗口消息 0 done