[C#] WinAPI OpenProcess 함수로 프로세스 핸들 얻기
카테고리: C# + Unity
프로세스 핸들
프로세스 핸들(Process Handle)은 컴퓨터 운영 체제에서 프로세스를 식별하고 관리하기 위한 개념이다. 프로세스 핸들은 보통 운영 체제 API에서 제공되며, 각 언어 및 환경에서는 해당 API를 이용하여 프로세스 핸들을 얻고 조작한니다. 프로그래밍에서는 핸들을 이용하여 프로세스나 자원을 제어하는 데 사용한다.
주요한 Windows API 함수 및 프로세스 핸들과 관련된 몇 가지가 있다.
- CreateProcess 함수: 새로운 프로세스를 생성하고 핸들을 반환한다.
- OpenProcess 함수: 기존 프로세스의 핸들을 얻는다.
- CloseHandle 함수: 프로세스 핸들을 닫는다.
소스 코드
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace Win32 {
internal class Program {
const uint PROCESS_ALL_ACCESS = 0x1F0FFF;
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int dwProcessId);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CloseHandle(IntPtr hObject);
static void Main(string[] args) {
string processName = "notepad"; // 대상 프로세스명 입력
int pid = GetProcessId(processName);
if (pid != -1) {
IntPtr processHandle = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
if (processHandle != IntPtr.Zero) {
Console.WriteLine($"프로세스 핸들 '{processHandle}'을 열었습니다.");
CloseHandle(processHandle);
} else {
Console.WriteLine("프로세스 핸들을 열 수 없습니다.");
}
} else {
Console.WriteLine($"프로세스 '{processName}'을 찾을 수 없습니다.");
}
}
private static int GetProcessId(string processName) {
Process[] processes = Process.GetProcessesByName(processName);
if (processes.Length > 0) {
return processes[0].Id;
} else {
return -1;
}
}
}
}
프로세스 핸들은 일반적으로 프로세스의 생성, 제어, 모니터링 등 다양한 작업에서 사용된다. 다만, 핸들을 올바르게 관리하지 않으면 리소스 누수가 발생할 수 있으므로, CloseHandle 함수를 사용하여 핸들을 명시적으로 닫는 것이 중요하다.
참고
https://learn.microsoft.com/ko-kr/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess
https://blog.naver.com/PostView.naver?blogId=tipsware&logNo=221065382244
https://chanos.github.io/post/Window-API-Win32-API에서-제공하는-자료형데이터-타입-모음과-핸들HANDLE