2012-03-06 20 views
1

我一直在寻找相当长的一段时间,似乎无法找到一个好方法来做到这一点。我基本上有一个使用WPF(没有可见窗口)的C#进程,我需要处理WM_事件(例如WM_CLOSEWM_DESTROY,例如;这样我可以在用户选择注销时优雅地关闭或重新启动他们的机器)。在无窗口的C#进程中处理WM_事件

有一些解决方案,我见过有使用System.Windows.InteropServices调用AddHook,并为其提供一个指向一个函数,则成为WndProc暗示的。就我所知,这个问题依赖于实际可见的窗口(在这种情况下,没有窗口)。

另一种建议但不起作用的方法是覆盖WinForm的WndProc方法,但该进程没有可见的窗体或窗口。

我也发现了一些涉及到消息窗口的东西。某种仍然接收WM_事件的不可见窗口。从我所看到的情况来看,这只适用于Microsoft.WindowsCE.Forms组件。我在我的项目和子类MessageWindow中添加了对此程序集的引用,如http://msdn.microsoft.com/en-us/library/microsoft.windowsce.forms.messagewindow.aspx所示,但似乎仍然无效。 WndProc内部的断点没有被击中。

任何线索?

+0

已经有一段时间,因为我已经在那个水平上玩过,但我似乎记得使用0作为HWND(我似乎记得阅读某处是桌面的HWND)。我不得不挖掘我的档案来验证,但我几乎肯定这工作。 – 2012-03-06 00:26:06

回答

1

想想你在问什么 - 如果你没有窗口,你的应用程序怎么会收到一个窗口消息(考虑到消息被发送到一个窗口的句柄)。

这就好像在说“如何在没有电子邮件地址的情况下接收电子邮件?”

Michael Entin涵盖了windows关机期间的行为here

我99%确定在用户会话中运行的所有进程都会在用户注销时自动关闭,所以这不应该成为问题。如果你真的必须处理这个窗口消息,你可以创建一个隐藏窗口,根据Any way to create a hidden main window in C#?

+0

克里斯是对的。只要你的应用程序在被问到时不阻止自己关闭,它应该干净地关闭。因此,下一个问题是为什么将您的应用程序编写为无窗口的后台应用程序而不是Windows服务? – 2012-03-06 00:27:46

+0

@RichardTurner - 您如何期望Windows服务能够挂钩Windows事件? – 2012-03-06 00:28:54

+0

@ M.Babcock他没有提到处理Windows键和鼠标事件,除了“WM_CLOSE”和“WM_DESTROY”(这大概只需要关闭应用程序,因为我指出这不是必要的) – 2012-03-06 00:30:15