ÇÁ·Î±×·¥¿¡¼ ´Ù¸¥ ÇÁ·Î±×·¥À» ½ÇÇà½Ã۰í 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("ÇÁ·Î¼¼½º »ý¼º ½ÇÆÐ");
|