본문 바로가기
delphi

프로세스 아이디(ProcessID)로 윈도우 핸들(Handle) 얻기

by doran365 2024. 7. 31.

윈도우 운영 체제에서 특정 프로세스의 핸들을 얻는 것은 다양한 시스템 관리 작업에서 매우 중요한 역할을 합니다. 이 문서에서는 프로세스 아이디(ProcessID)를 사용하여 윈도우 핸들(Handle)을 얻는 방법을 상세히 설명하겠습니다. 이를 통해 시스템 관리자와 개발자들이 보다 효율적으로 작업을 수행할 수 있도록 돕겠습니다.

프로세스 아이디란?

프로세스 아이디(ProcessID)는 운영 체제에서 실행 중인 각 프로세스를 고유하게 식별하는 숫자입니다. 각 프로세스는 자신만의 고유한 아이디를 가지며, 이를 통해 시스템 내의 프로세스를 구별할 수 있습니다.

윈도우 핸들이란?

윈도우 핸들(Handle)은 윈도우 운영 체제에서 시스템 자원을 식별하고 관리하기 위한 고유한 식별자입니다. 예를 들어, 윈도우 핸들은 창, 파일, 스레드 등의 다양한 시스템 자원을 나타낼 수 있습니다.

GetHandleByPID 함수 설명

다음은 특정 프로세스 아이디를 사용하여 윈도우 핸들을 얻는 데 사용되는 Delphi 함수입니다.

function GetHandleByPID(target_pid: longword): THandle;
var
  test_hwnd: longword;
  test_pid: longword;
  test_thread_id: longword;
begin
  Result := 0;
  test_hwnd := FindWindow(nil, nil);
  while test_hwnd <> 0 do
  begin
    if GetParent(test_hwnd) = 0 then
    begin
      test_thread_id := GetWindowThreadProcessId(test_hwnd, test_pid);
      if test_pid = target_pid then
      begin
        Result := test_hwnd;
        exit;
      end;
    end;
    test_hwnd := GetWindow(test_hwnd, GW_HWNDNEXT);
  end;
end;

함수 설명

이 함수는 다음과 같은 절차를 통해 작동합니다.

  1. 초기화: 함수가 호출되면 Result 변수를 0으로 초기화합니다. 이는 핸들을 찾지 못했을 때 반환할 기본값입니다.
  2. FindWindow 호출: FindWindow(nil, nil) 함수를 사용하여 첫 번째 윈도우 핸들을 검색합니다.
  3. 반복문: while 루프를 통해 모든 윈도우 핸들을 순회합니다.
  4. 부모 창 검사: GetParent(test_hwnd) = 0 조건을 통해 최상위 윈도우인지 확인합니다.
  5. 프로세스 아이디 확인: GetWindowThreadProcessId(test_hwnd, test_pid) 함수를 호출하여 현재 윈도우 핸들의 프로세스 아이디를 가져옵니다.
  6. 목표 프로세스 아이디와 비교: test_pid가 target_pid와 동일한지 확인합니다.
  7. 핸들 반환: 만약 동일하다면, Result에 현재 핸들을 저장하고 함수 실행을 종료합니다.
  8. 다음 윈도우 핸들로 이동: GetWindow(test_hwnd, GW_HWNDNEXT) 함수를 호출하여 다음 윈도우 핸들로 이동합니다.

주요 함수 및 메서드

FindWindow

FindWindow 함수는 특정 클래스 이름이나 창 제목을 기준으로 윈도우 핸들을 검색합니다. 이 함수는 주로 최상위 윈도우를 찾는 데 사용됩니다.

GetParent

GetParent 함수는 특정 윈도우 핸들의 부모 윈도우 핸들을 반환합니다. 최상위 윈도우인 경우, 이 함수는 0을 반환합니다.

GetWindowThreadProcessId

GetWindowThreadProcessId 함수는 특정 윈도우 핸들에 연결된 스레드 아이디와 프로세스 아이디를 가져옵니다. 이 함수는 윈도우 핸들에서 프로세스 아이디를 추출하는 데 사용됩니다.

GetWindow

GetWindow 함수는 지정된 윈도우 핸들의 형제 윈도우를 검색하는 데 사용됩니다. 이 함수는 다음 윈도우 핸들로 이동하는 데 유용합니다.

활용 예제

이제 앞서 설명한 함수를 활용하여 실제로 특정 프로세스 아이디의 윈도우 핸들을 얻는 예제를 살펴보겠습니다.

procedure TForm1.Button1Click(Sender: TObject);
var
  target_pid: longword;
  window_handle: THandle;
begin
  target_pid := 1234; // 검색할 프로세스 아이디
  window_handle := GetHandleByPID(target_pid);
  if window_handle <> 0 then
    ShowMessage('윈도우 핸들: ' + IntToStr(window_handle))
  else
    ShowMessage('해당 프로세스 아이디에 대한 윈도우 핸들을 찾을 수 없습니다.');
end;

위의 예제에서는 Button1Click 이벤트 핸들러에서 GetHandleByPID 함수를 호출하여 프로세스 아이디가 1234인 프로세스의 윈도우 핸들을 검색합니다. 검색된 핸들이 있으면 메시지 박스로 핸들을 출력하고, 없으면 찾을 수 없다는 메시지를 출력합니다.

코드 실행 환경 설정

Delphi 설치

Delphi는 Embarcadero Technologies에서 제공하는 통합 개발 환경(IDE)으로, 주로 Pascal 언어를 사용하여 소프트웨어를 개발합니다. Delphi를 설치하고 위의 코드를 실행하려면 다음 단계를 따르십시오.

  1. Delphi 다운로드 및 설치: Embarcadero 공식 웹사이트에서 Delphi를 다운로드하여 설치합니다.
  2. 새 프로젝트 생성: Delphi를 실행하고 새 VCL Forms Application 프로젝트를 생성합니다.
  3. 코드 입력: 위의 예제 코드를 Form1의 이벤트 핸들러에 입력합니다.
  4. 컴파일 및 실행: 프로젝트를 컴파일하고 실행하여 결과를 확인합니다.

코드 테스트 및 디버깅

프로세스 아이디와 관련된 코드의 경우, 실제 실행 환경에서 테스트 및 디버깅하는 것이 중요합니다. 다음은 디버깅 시 유용한 몇 가지 팁입니다.

  1. 로그 출력: 코드 내에 ShowMessage 함수를 사용하여 중간 결과를 출력합니다.
  2. 디버그 모드 사용: Delphi IDE에서 디버그 모드를 활성화하여 변수 값을 실시간으로 확인합니다.
  3. 문서 참조: Delphi 공식 문서 및 WinAPI 문서를 참조하여 함수 동작을 이해합니다.

결론

이 문서에서는 프로세스 아이디(ProcessID)를 사용하여 윈도우 핸들(Handle)을 얻는 방법을 상세히 설명했습니다. Delphi를 사용한 예제 코드와 함께 주요 함수 및 메서드의 역할을 이해하고, 실제 환경에서의 활용 방법을 소개했습니다. 이를 통해 시스템 관리자와 개발자들이 보다 효율적으로 작업을 수행할 수 있을 것입니다.