Forms 为什么SetWinEventHook回调需要表单?

Forms 为什么SetWinEventHook回调需要表单?,forms,winapi,hook,Forms,Winapi,Hook,目前,我正在使用功能强大的SetWinEventHook()函数捕获一些用户界面的操作,例如从计算机上程序运行的其他窗口最小化和最大化 因此,我从使用BrendanMcK on提供的代码中获得了灵感,它确实可以工作(我的意思是:在事件发生时调用回调函数),直到 MessageBox.Show("Something") 他在场。但是我不想为这个程序使用任何窗体或窗口 之后,我发现这种钩子需要一个消息循环,以允许从其他窗口句柄重定向消息。显然,使用Application.Run()调用线程,但我更

目前,我正在使用功能强大的SetWinEventHook()函数捕获一些用户界面的操作,例如从计算机上程序运行的其他窗口最小化和最大化

因此,我从使用BrendanMcK on提供的代码中获得了灵感,它确实可以工作(我的意思是:在事件发生时调用回调函数),直到

MessageBox.Show("Something")
他在场。但是我不想为这个程序使用任何窗体或窗口

之后,我发现这种钩子需要一个消息循环,以允许从其他窗口句柄重定向消息。显然,使用Application.Run()调用线程,但我更希望C#对象本身更干净

所以我的问题是:有可能在对象的方法中创建一个消息循环吗


否,该函数不需要窗口句柄,因此不需要“表单”。但函数的MSDN文档非常明确:

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

消息循环在任何希望接收由其他进程或线程外部生成的通知的程序中都是通用的。这是解决问题的常见方法。显然,任何GUI应用都需要这样的解决方案,Windows消息是由操作系统生成的。对于SetWinEventHook(),可访问性事件起源于其他程序,这没有什么不同。没有干净的机制来“中断”线程并使其运行其他代码,导致的重入问题极难处理。线程必须协同工作,它必须空闲并准备好接收通知以安全地处理它。消息循环解决了这个问题

在方法中泵送消息循环(调用Application.Run)当然是可能的。但是请记住,在使用Application.ExitThread显式停止循环之前,该方法不会返回。因此,该调用通常只有一个好位置,即程序的Main()方法


使用Winforms或WPF项目模板启动项目是一个非常好的方法。在pinvoking SetWinEventHook之后,无需实际创建窗口,无需参数调用Application.Run()。

否,该函数不需要窗口句柄,因此不需要“表单”。但函数的MSDN文档非常明确:

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

消息循环在任何希望接收由其他进程或线程外部生成的通知的程序中都是通用的。这是解决问题的常见方法。显然,任何GUI应用都需要这样的解决方案,Windows消息是由操作系统生成的。对于SetWinEventHook(),可访问性事件起源于其他程序,这没有什么不同。没有干净的机制来“中断”线程并使其运行其他代码,导致的重入问题极难处理。线程必须协同工作,它必须空闲并准备好接收通知以安全地处理它。消息循环解决了这个问题

在方法中泵送消息循环(调用Application.Run)当然是可能的。但是请记住,在使用Application.ExitThread显式停止循环之前,该方法不会返回。因此,该调用通常只有一个好位置,即程序的Main()方法

使用Winforms或WPF项目模板启动项目是一个非常好的方法。在pinvoking SetWinEventHook之后,您不需要实际创建一个窗口,调用Application.Run(),而不带参数