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;
예제 실행 결과 :
'프로그래밍 > 델파이' 카테고리의 다른 글
유니코드용 InnoSetup으로 만든 설치 프로그램에 ActveX를 통한 설치시 먹통이 되는 문제 (0) | 2010.08.30 |
---|---|
XML 파일에 CDATA 노드 만들기 (0) | 2010.07.25 |
엑세스 바이얼레이션(Access Violation) 주소로 오류가 발생한 소스상의 위치 찾기 (1) | 2010.05.25 |
CreateMutex를 이용한 다중 실행 방지 방법. (0) | 2010.04.16 |
잘동작하던 ActiveX가 기능 추가후, 먹통이 되어 버린 경험. (0) | 2010.04.15 |