首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言判斷進程是否存在並關閉它

     編輯:C 語言問答

C語言在 Windows 下查找並終止指定進程

在 C 語言中,標準庫並未提供直接操作進程的功能,因為進程管理屬於作業系統層面的功能。若在 Windows 環境下開發,最常用的方法是使用 ToolHelp Library(工具幫助庫)提供的 API 來遍歷系統進程快照,找到目標進程後再呼叫 TerminateProcess 將其關閉。

核心 API 介紹

  • CreateToolhelp32Snapshot:建立系統進程的快照。
  • Process32First / Process32Next:遍歷快照中的進程項目。
  • OpenProcess:取得進程控制代碼(需 PROCESS_TERMINATE 權限)。
  • TerminateProcess:強制終止指定進程。

實作步驟

  1. 呼叫 CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) 取得進程快照控制代碼。
  2. 使用 Process32First 獲取第一個進程資訊,填入 PROCESSENTRY32 結構(注意先設定 dwSize)。
  3. 在迴圈中以 Process32Next 逐一比對進程名稱(szExeFile 欄位)。
  4. 找到目標後,呼叫 OpenProcess(PROCESS_TERMINATE, FALSE, pe.th32ProcessID) 取得進程控制代碼。
  5. 最後呼叫 TerminateProcess(hProcess, 0) 終止進程,並關閉相關控制代碼。

完整範例程式碼

#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <tchar.h>

BOOL TerminateProcessByName(LPCTSTR szProcessName)
{
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot == INVALID_HANDLE_VALUE) return FALSE;

    PROCESSENTRY32 pe = { sizeof(PROCESSENTRY32) };
    BOOL bFound = FALSE;

    if (Process32First(hSnapshot, &pe)) {
        do {
            if (_tcsicmp(pe.szExeFile, szProcessName) == 0) {
                HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pe.th32ProcessID);
                if (hProcess) {
                    TerminateProcess(hProcess, 0);
                    CloseHandle(hProcess);
                    bFound = TRUE;
                }
            }
        } while (Process32Next(hSnapshot, &pe));
    }
    CloseHandle(hSnapshot);
    return bFound;
}

int main()
{
    if (TerminateProcessByName(_T("notepad.exe"))) {
        _tprintf(_T("進程已成功終止。\n"));
    } else {
        _tprintf(_T("未找到目標進程或終止失敗。\n"));
    }
    return 0;
}

注意事項

終止進程屬於高風險操作,可能導致資料遺失或系統不穩定。實際專案中建議優先嘗試優雅關閉(如發送 WM_CLOSE 訊息),僅在必要時使用強制終止。此外,若目標進程以較高權限執行,呼叫端也需具備相應權限(如以系統管理員身分執行)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved