-
[C#] WinAPI OpenProcess 함수로 프로세스 핸들 얻기프로그래밍/C# + Unity 2024. 2. 28. 14:06728x90
프로세스 핸들
프로세스 핸들(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://blog.naver.com/PostView.naver?blogId=tipsware&logNo=221065382244
https://chanos.tistory.com/entry/Window-API-Win32-API에서-제공하는-자료형데이터-타입-모음과-핸들HANDLE
728x90댓글