在无窗口C#进程中处理WM#事件

在无窗口C#进程中处理WM#事件,c#,events,event-handling,wndproc,C#,Events,Event Handling,Wndproc,我已经四处寻找了很长一段时间,似乎找不到一个好方法来做这件事 基本上,我有一个使用WPF(没有可见窗口)的C#进程,我需要在其中处理WM#事件(例如WM#u CLOSE或WM#u DESTROY;这样,当用户选择注销或重新启动机器时,我可以优雅地关闭) 我见过很多解决方案,建议使用System.Windows.InteropServices调用AddHook,并为其提供指向函数的指针,该函数随后成为WndProc。问题是,据我所知,这取决于窗口是否实际可见(在本例中没有窗口) 另一种建议但不起作

我已经四处寻找了很长一段时间,似乎找不到一个好方法来做这件事

基本上,我有一个使用WPF(没有可见窗口)的C#进程,我需要在其中处理WM#事件(例如
WM#u CLOSE
WM#u DESTROY
;这样,当用户选择注销或重新启动机器时,我可以优雅地关闭)

我见过很多解决方案,建议使用
System.Windows.InteropServices
调用
AddHook
,并为其提供指向函数的指针,该函数随后成为
WndProc
。问题是,据我所知,这取决于窗口是否实际可见(在本例中没有窗口)

另一种建议但不起作用的方法是重写WinForm的
WndProc
方法,但此过程没有可见的窗体或窗口

我还发现了一些只涉及消息窗口的内容。某种仍然接收WM_u事件的不可见窗口。据我所见,这仅在Microsoft.WindowsCE.Forms程序集中可用。我在我的项目和子类MessageWindow中添加了对该程序集的引用,如:所示,但它似乎仍然不起作用。WndProc内的断点未被命中


有什么线索吗?

想想你在问什么——如果你没有窗口,你的应用程序如何接收窗口消息(考虑到消息被发送到窗口句柄)

这就像在说“没有电子邮件地址我怎么能收到电子邮件?”

Michael Entin介绍了windows在关机期间的行为


我99%确信,当用户注销时,在用户会话中运行的所有进程都会自动关闭,所以这不应该是一个问题。如果您确实必须处理此窗口消息,您可以根据创建一个隐藏窗口。请思考您的问题-如果您没有窗口,您的应用程序如何接收窗口消息(考虑到消息被发送到窗口句柄)

这就像在说“没有电子邮件地址我怎么能收到电子邮件?”

Michael Entin介绍了windows在关机期间的行为


我99%确信,当用户注销时,在用户会话中运行的所有进程都会自动关闭,所以这不应该是一个问题。如果您确实必须处理此窗口消息,您可以根据

创建一个隐藏窗口。我已经有一段时间没有在该级别玩过了,但我似乎记得在HWND中使用了0(我似乎记得在某个地方读过的是桌面的HWND)。我必须翻阅我的档案进行验证,但我几乎可以肯定这是有效的。我已经有一段时间没有玩过那个级别的游戏了,但我似乎记得在HWND中使用了0(我似乎记得在某个地方读过的是桌面的HWND)。我必须翻阅我的档案来核实,但我几乎可以肯定这是有效的。克里斯是对的。只要你的应用程序在被问到时不阻止自己关闭,它就应该干净地关闭。因此,下一个问题是,为什么要将你的应用程序编写为无窗口后台应用程序而不是Windows服务?@RichardTurner-你怎么期望Windows服务能够钩住Windows事件?@M.Babcock他没有提到处理Windows键和鼠标事件,除了
WM\u CLOSE
WM\u DESTROY
(这大概他只需要关闭应用程序,正如我指出的,这是没有必要的)@ChrisShain-Editted。我对这个问题读得太深了。我不是说你的问题是错的,但如果OP需要这样做(对于一些未知的角落案例)那么Windows服务也不会有帮助。@ChrisShain-谢谢你提供的信息。关于关机过程的链接很有趣,但他特别忽略了讨论我的情况,这是一个没有ui的应用程序,我(显然)更感兴趣。此外,是的,我目前只关心WM\u CLOSE、WM\u DESTROY、WM\u QUERYENDSESSION(可能),和WM_ENDSESSION(正如您链接的文章所示)。C#中隐藏的主窗口的解决方案似乎真的是一个难题(不幸的是),只是创建一个没有任务栏条目的屏幕外窗口=(Chris是对的。只要你的应用程序在被问到时不会自动关闭,它就应该干净地关闭。因此,下一个问题是,为什么要将你的应用程序编写为无窗口后台应用程序而不是Windows服务?@RichardTurner-你怎么期望Windows服务能够钩住Windows事件?@M.Babcock他不知道。)n处理windows按键和鼠标事件,而不是
WM_CLOSE
WM_DESTROY
(他大概只需要关闭应用程序,正如我指出的,这是不必要的)@ChrisShain-Editted。我对这个问题读得太多了。我不是说你的问题是错的,但如果OP需要这样做的话(对于一些未知的情况)那么Windows服务也不会有帮助。@ChrisShain-谢谢你提供的信息。关于关机过程的链接很有趣,但他特别忽略了讨论我的情况,这是一个没有ui的应用程序,我(显然)是这样的更感兴趣。此外,是的,我目前只关心WM_CLOSE、WM_DESTROY、WM_QUERYENDSESSION(可能)和WM_ENDSESSION(从您链接的文章中可以看出)。C#中隐藏主窗口的解决方案似乎是一个难题(不幸的是),只是创建一个没有任务栏条目的屏幕外窗口=(