CreateProcess를 사용해서 ProcessId가 있으면 간단한데...
연결 파일을 실행하느라 ShellExecuteEx를 사용했더니 hProcess만 튀어 나오더군요...
구글링 해서 찾은 많은 방법 중 이 방법이 (트릭이지만) 가장 간단하네요.
hProcess를 이용해 방금 실행한 프로세스의 실행 시간을 알아내고.
실행된 프로세스 목록에서 시간이 같은 프로세스를 찾아냅니다.
bool ret = ShellExecuteEx( &execinfo );
if (!ret)
//실행 실패
return;
WaitForInputIdle(execinfo.hProcess, 1000);
FILETIME lpCreationTime, lpCreationTime2;
FILETIME d1,d2,d3;
DWORD dwProcessId;
HANDLE hProc;
GetProcessTimes( execinfo.hProcess, &lpCreationTime, &d1, &d2, &d3 );
HWND hTemp = ::FindWindow(NULL,NULL);
while ( hTemp != NULL ) {
if ( ::GetParent(hTemp) == NULL ) {
::GetWindowThreadProcessId(hTemp,&dwProcessId);
hProc = OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwProcessId);
GetProcessTimes( hProc, &lpCreationTime2, &d1, &d2, &d3 );
CloseHandle(hProc);
if ( lpCreationTime.dwHighDateTime == lpCreationTime2.dwHighDateTime
&& lpCreationTime.dwLowDateTime == lpCreationTime2.dwLowDateTime )
{
//찾았다. hTemp가 그 놈...
break;
}
hTemp = ::GetWindow(hTemp, GW_HWNDNEXT) ;
}
}
출처 : http://msgroups.net/vc.mfc/shellexecuteex-from-dll-and-want-hwnd-from-hprocess/559812
|
저는 예전에 GetWindow대신 EnumWindow 를 써서 했었네요
참조 http://cafe.naver.com/bcbmaster/616