프로그램에서 다른 프로그램을 실행시키고 SendMessage 등으로 메시지를 보내고 싶은 경우가 있는데요.
SendMessage에는 윈도우 핸들을 넣어야 하기 때문에, 실행시킨 프로그램의 윈도우 핸들을 얻어야 하죠.
FindWindow로 찾으면 간단하지만, 같은 프로그램이 여러개 실행될 가능성이 있는 경우에는 쓸 수 없죠.
구글링을 통해서 윈도우 핸들을 찾을 수 있는 코드를 만들었습니다.
// idea from http://support.microsoft.com/kb/242308/en-us
ULONG ProcIDFromWnd(HWND hwnd) // 윈도우 핸들로 프로세스 아이디 얻기
{
ULONG idProc;
GetWindowThreadProcessId( hwnd, &idProc );
return idProc;
}
HWND GetWinHandle(ULONG pid) // 프로세스 아이디로 윈도우 핸들 얻기
{
HWND tempHwnd = FindWindow(NULL,NULL); // 최상위 윈도우 핸들 찾기
while( tempHwnd != NULL )
{
if( GetParent(tempHwnd) == NULL ) // 최상위 핸들인지 체크, 버튼 등도 핸들을 가질 수 있으므로 무시하기 위해
if( pid == ProcIDFromWnd(tempHwnd) )
return tempHwnd;
tempHwnd = GetWindow(tempHwnd, GW_HWNDNEXT); // 다음 윈도우 핸들 찾기
}
return NULL;
}
사용 방법은 아래와 같습니다.
bool result;
STARTUPINFO si;
ZeroMemory(&si,sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
result = CreateProcess("SpxCaster.exe",NULL,NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi); // 프로세스 만들기
if( result )
{
HWND hwnd;
DWORD startTime = timeGetTime();
while(true) // CreateProcess 하면 바로 윈도우가 열리는게 아니므로 대기하기 위해
{
if( timeGetTime() - startTime > 5000 ) // 무한 대기 방지용. 5초 초과되면 루프 나가야 하므로 판단
break;
else
Sleep(100);
hwnd = GetWinHandle(pi.dwProcessId); // 프로세스 아이디로 윈도우 핸들 얻기
if( hwnd != NULL )
{
// 프로세스 아이디와 핸들을 이용
m_CasterHandle = pi.hProcess;
m_CasterHWND = hwnd;
break;
}
}
if( hwnd == NULL )
MsgError("핸들 발견 실패");
}
else
MsgError("프로세스 생성 실패");
|