2013-02-05 14 views
6

我在關機期間發生了問題。我有一段用C++編寫的代碼,它包裝在一個.dll文件中並注入到其他應用程序中。它做了一堆東西,包括啓動另一個用C#編寫的應用程序(服務器)。在Windows C++或C#中,您可以詢問操作系統是否正在關閉/重新啓動/註銷

但是,在啓動關機之後,C++代碼將啓動C#應用程序,因爲它已被關閉終止,由於系統即將關閉而迅速崩潰。

然後,一個錯誤框停止關閉,直到用戶處理它,這是煩人的。有沒有辦法問OS:「嘿,你正在關機/重新啓動/註銷嗎?」所以我不會在發生這種情況時啓動應用程序?我想兩端的解決方案都可以。

== 編輯 ==

對於多一點澄清。以注入的.dll方式運行的代碼不能假定其注入的應用程序具有任何類型的「窗口」。另外,我希望能夠查詢一些事情,而不是我必須聽的事件,因爲由於時間原因我可能會錯過該事件。我不知道是否有任何形式的功能,這將有效地給我這樣

bool IsSystemShutting(); 

,在這方面,在C#的選擇,我會的工作,以及一個C++選項的東西。但是在.NET框架中,SystemEvents.SessionEndingSystemEvents.SessionEnded都是事件與屬性。在事件發生後我會​​註冊參加這個活動的情況很多,所以這對我沒有好處。

回答

4

WM_ENDSESSIONWM_QUERYENDSESSION消息是針對這種情況。當關閉,重新啓動或註銷過程啓動時,Windows會將這些窗口消息發送到窗口。

+1

我不確定這對我有用。它看起來像你必須設置一個回調來捕獲這條消息。我的代碼被注入到另一個應用程序,所以它可能會捕獲這條消息,而我沒有收到它。我真的不想在操作系統關閉的時候被告知,我想根據自己的計劃問問。這是可能的還是這個回調的唯一途徑。另外,我駐留在沒有窗口的進程中。這是否會成爲這種方法的問題? – Ultratrunks

+0

您始終可以創建一個存根隱藏窗口並在共享內存中維護關閉狀態(使用這兩條消息)的存根單例可執行文件。該存根可以由核心應用程序的第一個實例產生。然後,您的應用程序可以通過查看存根單例的共享內存來查詢關閉狀態。它不是最簡單的代碼,但它會起作用。 – syazdani

相關問題