프로그래밍/델파이

프로세스ID(ProcessID)로 윈도우 핸들(HWND) 구하기

채윤아빠 2010. 6. 9. 21:43
728x90
반응형
서론
CreateProcess로 새로운 프로세스를 만든 이후에, 만들어진 프로세스의 메인 윈도우 핸들을 얻기 위한 방법을 알아 보겠습니다.

특정 클래스의 윈도우 핸들을 얻기 위해서 FindWindow를 사용하는데, 개발자가 임의로 CreateProcess를 통하여 실행시킨 프로세스의 메인 윈도우 핸들을 얻는 방법은 다음 GetHwndFromProcessID 함수를 이용하면 됩니다.

설명
아래 GetHwndFromProcessID 함수의 코드입니다.
function GetHwndFromProcessID(dwProcessID: DWORD): THandle;
var
  hWnd: THandle;
  dwProcessID2: DWORD;
begin
  hWnd := FindWindow(nil, nil); // 최상위 윈도우 핸들 찾기
  Result := 0;
  while( hWnd <> 0 ) do
  begin
    if( 0 = GetParent(hWnd)) then
    begin // 최상위 핸들인지 체크, 버튼 등도 핸들을 가질 수 있으므로 무시하기 위해
      GetWindowThreadProcessId( hWnd, @dwProcessID2 );
      if( dwProcessID2 = dwProcessID ) then
      begin
        Result := hWnd;
        break;
      end;
    end;
    hWnd := GetWindow(hWnd, GW_HWNDNEXT); // 다음 윈도우 핸들 찾기
  end;
end;


아래는 간단한 사용법입니다.
procedure TForm1.btnGetHWNDClick(Sender: TObject);
var
  hWnd: THandle;
  strCaption: string;
begin
  hWnd := GetHwndFromProcessID(StrToIntDef(edtProcessID.Text, 0));
  SetLength(strCaption, 512);
  SetLength(strCaption, GetClassName(hWnd, @strCaption[1], 512));
  ShowMessage(IntToHex(hWnd, 8) + ' : ' + strCaption);
end;

예제 실행 결과 :