2012-03-06 82 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