我一直在寻找一段时间,似乎无法找到一个好方法。
基本上我有一个使用WPF(没有可见窗口)的C#进程,我需要处理WM_事件(比如WM_CLOSE
或WM_DESTROY
;这样我就可以优雅地关闭当用户选择注销或重新启动他们的机器时。)
我见过很多解决方案建议使用System.Windows.InteropServices
来调用AddHook
并为其提供一个指向函数的指针,然后该函数成为WndProc
。这个问题是,据我所知,它取决于实际可见的窗口(在这种情况下没有窗口)。
另一种建议但不起作用的方法是覆盖WinForm的WndProc
方法,但此过程没有可见的窗体或窗口。
我还发现了一些指向仅消息窗口的内容。某种不可见的窗口仍然接收WM_事件。从我所看到的情况来看,这仅适用于Microsoft.WindowsCE.Forms
程序集。我在我的项目中添加了对此程序集的引用,并在http://msdn.microsoft.com/en-us/library/microsoft.windowsce.forms.messagewindow.aspx中指示了子类MessageWindow,但它似乎仍无效。 WndProc内部的断点没有被击中。
有任何线索吗?
答案 0 :(得分:1)
想想你在问什么 - 如果你没有窗口,你的应用程序如何收到窗口消息(考虑到消息被发送到窗口的句柄)。
这就像是说“如果没有电子邮件地址我怎么才能收到电子邮件?”
Michael Entin在关机here期间涵盖了Windows的行为。
我99%确定用户会话中运行的所有进程都会在用户注销时自动关闭,所以这不应该是个问题。如果您真的必须处理此窗口消息,则可以按照Any way to create a hidden main window in C#?
创建隐藏窗口