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

时间:2012-03-06 00:01:03

标签: c# events event-handling wndproc

我一直在寻找一段时间,似乎无法找到一个好方法。

基本上我有一个使用WPF(没有可见窗口)的C#进程,我需要处理WM_事件(比如WM_CLOSEWM_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内部的断点没有被击中。

有任何线索吗?

1 个答案:

答案 0 :(得分:1)

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

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

Michael Entin在关机here期间涵盖了Windows的行为。

我99%确定用户会话中运行的所有进程都会在用户注销时自动关闭,所以这不应该是个问题。如果您真的必须处理此窗口消息,则可以按照Any way to create a hidden main window in C#?

创建隐藏窗口