簡體   English   中英

有沒有辦法從 .net C# 控制台應用程序檢測系統關閉並延遲關閉直到您的程序可以正常退出?

[英]Is there a way to detect a System-Shutdown from a .net C# Console App and delay the shutdown until your program can gracefully exit?

請記住,這是一個使用 C# 運行 .NET 的控制台應用程序。 此外,我稍后可能會將其轉換為服務,但就目前而言,我需要在控制台應用程序運行時處理關閉。

我的系統有時會被 Windows 更新或 Kace 更新自動關閉。 當我的程序在半夜進行長時間的測試並且我不在那里看到它發生時,這很煩人。 我希望能夠檢測到系統關閉並將其延遲足夠長的時間以便我的測試正常完成並允許我正常退出我的程序保持我的所有測試數據完好無損。

我查看了各種線程,似乎找不到可行的解決方案。 我已經嘗試了這兩種:

 AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit;
        Application.ApplicationExit += OnApplicationExit;

但這些事件似乎都沒有被解雇。 我基本上想在檢測到關機並暫停關機時向自己發送電子郵件通知。 或者至少以某種方式記錄一條消息......

我可以使用(所有東西)' notepad.exe '來模擬這種行為。 我只是打開 notepad.exe,輸入一些垃圾,然后嘗試關閉我的計算機。 計算機嘗試關閉,然后顯示一條消息,說它無法關閉,因為“記事本”阻止了它。

我希望我的程序以與“notepad.exe”相同的方式阻止關機(或至少延遲它)。

您可能擁有的任何信息、事件或其他想法都將非常有用。 提前感謝你的幫助。

這可以幫助您:

https://www.meziantou.net/prevent-windows-shutdown-or-session-ending-in-dotnet.htm

當用戶注銷或停止他的機器時,Windows 會退出所有打開的應用程序。 一些應用程序希望在結束之前執行代碼,以免丟失當前狀態(例如正在編寫的文檔)。

為此,Windows 向所有應用程序發送一條消息:

WM_QUERYENDSESSION when closing the session
WM_ENDSESSION when shutting down the machine

Windows 提供了 3 種方法:

ShutdownBlockReasonCreate

表示系統無法關閉並設置一個原因字符串,如果系統啟動,則顯示給用戶(屏幕截圖中的“我想活”)

ShutdownBlockReasonDestroy

表示可以關閉系統

SetProcessShutdownParameters

此函數設置一個進程相對於系統中其他進程的關閉順序

最后一種方法確定 Windows 將 WM_ENDSESSION 和 WM_QUERYENDSESSION 消息發送到應用程序的順序。 這用於應用程序 A 依賴於應用程序 B 的情況。應用程序 A 希望在應用程序 B 之前被通知機器正在停止以潛在地阻止此停止。 因此,當應用程序 A 阻止關閉時,應用程序 B 保持活動狀態。

優先級由 0 到 0x4FF 之間的整數定義。 0x4FF 是最高優先級(最先調用),0 是最低優先級(最后調用)。 默認情況下,應用程序的優先級為 280。

在鏈接中還有一個可以改編的 WinForm 代碼。 就像是:

private const int WM_QUERYENDSESSION=0x0011;
private bool isShuttingDown=false;
protected override void WndProc(ref Message m)
{
if(m.Msg==WM_QUERYENDSESSION)
{
isShuttingDown=true;
}
base.WndProc(ref m);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM