본문 바로가기
C++, MFC

[C++ / MFC] 실행중인 프로세스 찾기 / 종료시키기

by dev_drive 2022. 8. 9.
반응형

■ 실행중인 프로세스 찾기 (CreateToolhelp32Snapshot)

#include "tlhelp32.h"	// for CreateToolhelp32Snapshot

HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 processEntry32;
processEntry32.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hProcessSnap, &processEntry32))
    CloseHandle(hProcessSnap);

CString sProcessName = _T("notepad.exe");    // 메모장 찾기
while (Process32Next(hProcessSnap, &processEntry32))
{
    if (sProcessName.Compare(processEntry32.szExeFile) == 0)
    {
        // 일치하는 프로세스 존재 
    }
}

 

 

 

■ 실행중인 프로세스 찾기, 종료시키기 (EnumProcesses)

#include "psapi.h"    // for EnumProcesses

DWORD aProcesses[1024], cbNeeded;
if (EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))    // 프로세스 검색
{
    const int nItemCount = cbNeeded / sizeof(DWORD);
    TCHAR szProcessName[MAX_PATH];
    for (int i = 0; i < nItemCount; i++)
    {
        HANDLE hProcess = OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]);
        if (!hProcess)			continue;
  
        HMODULE hMod;
        DWORD cbNeeded;
        if (!EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))  // 모듈에 대한 핸들 검색
        {
            CloseHandle(hProcess);
            continue;
        }

        GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName) / sizeof(TCHAR));
        
        CString sProcessName = _T("notepad.exe");    // 메모장 찾기
        if (sProcessName.CompareNoCase(szProcessName) == 0)	   // 일치하는 프로세스 찾기 
            TerminateProcess(hProcess, 0);	  // 프로세스 종료

        CloseHandle(hProcess);
    }
}

 

※ 속도는 CreateToolhelp32Snapshot으로 하는게 더 빠르니 단순히 프로세스를 찾기만 할때는 첫번째 방식으로 사용하는게 좋아보입니다.

 

반응형

댓글