簡體   English   中英

如何使用C#安全關閉所有正在運行的應用程序

[英]how to close all running applications safely with c#

如何在不使用Windows注銷和關閉API函數的情況下使用C#安全關閉所有正在運行的應用程序。 關閉所有應用程序后,我想顯示我的應用程序

如果要替代標准Windows登錄機制,則說明操作不正確。 在2000 / XP上,考慮編寫自定義 GINA 替代品 在Vista / 7上,您需要編寫一個新的憑據提供程序,因為它們擺脫了舊的GINA / Winlogon堆棧。

如果您嘗試提供某種自定義服務,是否已考慮僅切換台式機 這基本上是Windows對Ctrl + Alt + Delete和UAC“安全桌面”所做的工作。 與殺死整個系統並重新填充相比,工作量要少得多。

認真地,認真思考您將要做什么。 以下幾乎可以肯定是錯誤的事情,並且可能並不總是與某些程序一起使用:

// I mean it! This will cause badness!
using System.Diagnostics;

Process me = Process.GetCurrentProcess();
foreach (Process p in Process.GetProcesses())
{
    if (P.Id != me.Id)
        P.CloseMainWindow(); // Sends WM_CLOSE; less gentle methods available too
}

您可以遍歷正在運行的進程,然后需要確定關閉其他進程時希望有多“溫柔”。 請注意,發送消息(例如WM_CLOSE )不會強制關閉它們。

我意識到這個問題是古老的,大約有10年的歷史了,但是我想對ChrisV的代碼進行擴展,並提供在不關閉Windows的情況下關閉其他應用程序所需的代碼。 不檢查“ winlogon”而不是“ winlogon.exe”。

using System.Diagnostics.

Process me = Process.GetCurrentProcess();
foreach (Process p in Process.GetProcesses())
{
    if (p.Id != me.Id && IntPtr.Zero != p.MainWindowHandle && false == p.ProcessName.Equals("explorer", StringComparison.CurrentCultureIgnoreCase))
    {
        // Sends WM_CLOSE; less gentle methods available too.
        p.CloseMainWindow();
    }
}

此外,以管理特權運行上述代碼,因此管理應用程序也將關閉。

注意:由於Windows桌面是資源管理器,因此文件資源管理器窗口將保持打開狀態。

我在Windows 10上進行了測試,效果很好。

Windows 10上的Process.StartInfo.FileName返回空字符串,因此定向文件名將不起作用。

注意:如果沒有主窗口(因此沒有應用程序),則p.MainWindowHandle為零,但是在許多情況下,它們不是應用程序,而是仍然具有MainWindowHandle。 我應該知道。 我創建了一個顯示非零MainWindowHandle的小程序,我看到了許多小程序,但在測試時只打開了幾個應用程序。 盡管如此,此代碼仍可以阻止Windows請求關閉。

暫無
暫無

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

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