최근 개인적으로 이것 저것 신경쓸 것 도 많고, 바쁘기도 해서, TSGMapsGPS 마무리 작업도 몇 개월 째 진행도 못하고 블로그는 방치 상태입니다. 흐헝흐흥 ㅠ.ㅠ
블로그의 정전을 깨기 위해 오랜만에 작업하면서 정리한(?) 코드를 올립니다.
이 코드는 볼랜드 포럼의 ‘프로세스 아이디로 윈도우 핸들 얻기’ 라는 글의(아래 링크) C 코드를 Delphi 용으로 조금 변형한 코드입니다.
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=895
함수 소개 :
실행 파일의 경로를 인자로 함수를 호출하면 실행파일 실행 후 리턴값으로 실행된 파일의 Window Handle 을 반환합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
Function TForm1.ApplicationStart(ApplicationPath : String) : THandle; // 함수 내 내부 함수. function GetWinHandle(pid : Cardinal): THandle; // 프로세스 아이디로 윈도우 핸들 얻기 var tempHwnd : THandle; idProc : Cardinal; begin result := 0; tempHwnd := FindWindow(NIL, NIL); // 최상위 윈도우 핸들 찾기 while( tempHwnd <> 0 ) do begin if( GetParent(tempHwnd) = 0 ) then // 최상위 핸들인지 체크, 버튼 등도 핸들을 가질 수 있으므로 무시하기 위해 begin GetWindowThreadProcessId( tempHwnd, idProc ); //if( pid = ProcIDFromWnd(tempHwnd) ) then if (pid = idProc) then begin result := tempHwnd; break; end; end; tempHwnd := GetWindow(tempHwnd, GW_HWNDNEXT); // 다음 윈도우 핸들 찾기 end; end; var SInfo: TStartupInfo; PInfo: TProcessInformation; begin Result := 0; if (ApplicationPath <> '') then begin if not FileExists(ApplicationPath) then // 파일의 존재 여부 확인. begin exit; end; end; FillChar(SInfo, SizeOf(SInfo), 0); SInfo.cb := SizeOf(SInfo); if CreateProcess(nil, PChar(ApplicationPath), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, SInfo, PInfo) then // 프로그램 실행. begin CloseHandle(PInfo.hThread); WaitForInputIdle(PInfo.hProcess, INFINITE); Result := GetWinHandle(PInfo.dwProcessId); CloseHandle(PInfo.hProcess); end; end; |