프로세스 아이디로 윈도우 핸들을 구하는 방법입니다.
아래 소스를 참고 하세요.
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;
}
사용 예제)
주의 할것은 프로세스가 생성된 뒤 윈도우가 제대로 생성될 때까지 Sleep함수로 기다려야 합니다.
startInfo.cb = sizeof(STARTUPINFO);
startInfo.lpReserved = NULL;
startInfo.lpTitle = L"계산기";
startInfo.lpDesktop = NULL;
startInfo.dwX = 0;
startInfo.dwY = 0;
startInfo.dwXSize = 0;
startInfo.dwYSize = 0;
startInfo.dwXCountChars = 0;
startInfo.dwYCountChars = 0;
startInfo.dwFlags = STARTF_USESTDHANDLES;
startInfo.wShowWindow = SW_SHOWDEFAULT;
startInfo.lpReserved2 = NULL;
startInfo.cbReserved2 = 0;
startInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
startInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
startInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
ref = CreateProcess(
L"C:\\WINDOWS\\system32\\calc.exe",
L"",
NULL,
NULL,
TRUE,
CREATE_NEW_CONSOLE,
NULL,
L"C:\\WINDOWS\\system32",
&startInfo,
&pidInfo);
Sleep(100);
myhWnd = GetWinHandle(pidInfo.dwProcessId);