C#關閉進程詳解

一、通過進程名關閉進程

通過進程名字來關閉進程是最常用的一種方式。下面的代碼會先獲取所有當前正在運行的進程,然後查找指定的進程名,最後如果找到則關閉該進程


Process[] processes = Process.GetProcesses();
foreach (Process process in processes)
{
    if (process.ProcessName == "processName")
    {
        process.Kill();
        break;
    }
}

以上代碼的核心是 Process.GetProcesses() 方法,它可以獲取到當前正在運行的所有進程。然後通過遍歷 Process 對象的 ProcessName 屬性來找到要關閉的進程,最後調用 Kill() 方法關閉進程

二、通過進程ID關閉進程

與通過進程名關閉進程類似,還可以通過進程ID來關閉進程。下面代碼會先獲取所有進程的ID,然後查找指定的進程ID,最後如果找到則關閉該進程


int processId = 1234; //指定進程ID
Process[] processes = Process.GetProcesses();
foreach (Process process in processes)
{
    if (process.Id == processId)
    {
        process.Kill();
        break;
    }
}

以上代碼的核心是 Process.GetProcesses() 方法,它可以獲取到當前正在運行的所有進程。然後通過遍歷 Process 對象的 Id 屬性來找到要關閉的進程,最後調用 Kill() 方法關閉進程

三、通過進程句柄關閉進程

除了通過進程名關閉進程和通過進程ID關閉進程以外,還可以通過進程句柄來關閉進程。下面的示例代碼會先通過進程名獲取到進程句柄,然後如果找到則關閉該進程。


[DllImport("user32.dll")]
public static extern int EnumWindows(EnumWindowsProc ewp, int lParam);
[DllImport("user32.dll")]
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

delegate bool EnumWindowsProc(IntPtr hWnd, int lParam);
bool GetWindowThreadProcessId(IntPtr hWnd, int lParam)
{
    uint processId;
    GetWindowThreadProcessId(hWnd, out processId);
    if (processId == lParam)
    {
        return false;
    }
    return true;
}

Process[] processes = Process.GetProcessesByName("processName");
foreach (Process process in processes)
{
    EnumWindowsProc enumProc = new EnumWindowsProc(EnumWindows);
    EnumWindows(enumProc, process.Id);
    if (process.HasExited)
    {
        continue;
    }
    process.Kill();
}

以上代碼的核心是 EnumWindows()GetWindowThreadProcessId() 方法。首先通過 Process.GetProcessesByName() 來獲取指定進程名的所有進程,然後通過 EnumWindowsProc() 方法來枚舉所有窗口,最後通過 GetWindowThreadProcessId() 方法來獲取與窗口關聯的進程ID,如果與目標進程的ID相同,則關閉窗口所在的進程。

四、通過WMI服務關閉進程

除了上述三種方法之外,還可以使用Windows Management Instrumentation (WMI) 服務來關閉進程。下面的示例代碼會先獲取指定進程名的所有進程的詳細信息,然後通過查詢 Win32_Process 類中的 Terminate() 方法來關閉進程。


string processName = "processName";
string query = "SELECT * FROM Win32_Process WHERE Name='" + processName + "'";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection processes = searcher.Get();
foreach (ManagementObject process in processes)
{
    process.InvokeMethod("Terminate", null);
}

以上代碼的核心是 Win32_Process 類和 Terminate() 方法。首先通過構造一個 WQL 查詢字元串,然後使用 ManagementObjectSearcher 對象來執行查詢,得到一個 ManagementObjectCollection 對象表示所有符合條件的進程。然後通過遍歷 ManagementObjectCollection 中的每個進程,最後調用 Terminate() 方法來關閉進程。

五、通過SendKeys()方法關閉進程

除了以上四種方法,還可以使用 SendKeys() 方法來模擬用戶按下 Alt + F4 按鍵組合,從而關閉當前激活的窗口。下面是示例代碼


[DllImport("user32.dll")]
public static extern int FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam);

const uint WM_SYSCOMMAND = 0x112;
const uint SC_CLOSE = 0xF060;

string processName = "processName";
Process[] processes = Process.GetProcessesByName(processName);
foreach (Process process in processes)
{
    int handle = FindWindow(null, process.MainWindowTitle);
    SendMessage((IntPtr)handle, WM_SYSCOMMAND, SC_CLOSE, 0);
}

以上代碼的核心是 FindWindow()SendMessage() 方法,其中 FindWindow() 方法可以找到指定窗口的句柄,而 SendMessage() 方法可以發送消息到指定窗口,這裡使用的兩個參數分別是 WM_SYSCOMMANDSC_CLOSE,表示發送 關閉窗口 消息。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/238726.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:12
下一篇 2024-12-12 12:12

相關推薦

  • 如何通過jstack工具列出假死的java進程

    假死的java進程是指在運行過程中出現了某些問題導致進程停止響應,此時無法通過正常的方式關閉或者重啟該進程。在這種情況下,我們可以藉助jstack工具來獲取該進程的進程號和線程號,…

    編程 2025-04-29
  • Java中的殭屍進程簡介與解決方法

    本文將對Java中的殭屍進程進行詳細闡述,並給出幾種解決方法。 一、殭屍進程的概念 在操作系統中,進程是指正在執行的程序。當一個進程創建了一個子進程,而該子進程完成了任務卻沒有被父…

    編程 2025-04-27
  • 多線程和多進程的應用

    多線程和多進程是現代編程中常用的技術,可以提高程序的效率和性能。本文將從不同的角度對多線程和多進程進行詳細的介紹和應用。 一、多線程 vs 多進程 多線程和多進程都是為了實現程序並…

    編程 2025-04-27
  • Python多進程讀取數據

    本文將從多個方面詳細闡述在Python中如何通過多進程讀取數據,並給出完整的代碼示例。 一、多進程概述 在計算機科學中,進程是正在執行的程序實例。多進程是指計算機系統同時執行多個進…

    編程 2025-04-27
  • 進程a與進程b共享變數s1

    本文將從多個方面對進程a與進程b共享變數s1做詳細的闡述,並給出代碼示例。 一、定義全局變數s1 進程a與進程b共享變數s1,意味著s1是一個全局變數。在C語言中,可以使用關鍵字e…

    編程 2025-04-27
  • python多進程並行循環

    在大數據時代,我們通常需要處理大量的數據。處理大數據往往需要較長的時間,影響效率。Python提供了多線程、多進程等並行處理方式來提高數據處理效率。本文將主要講解python多進程…

    編程 2025-04-27
  • Python進程池共享內存用法介紹

    本文將從多個方面詳細闡述Python進程池共享內存的相關知識,包括如何使用進程池、進程池的實現原理、進程池中的共享內存管理等。本文內容將涵蓋: 一、進程池的使用 進程池是一種有效的…

    編程 2025-04-27
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25

發表回復

登錄後才能評論