ShellExecute 또는 CreateProcess로 application을 실행하고
FindWindow로 해당 프로그램을 찾아서 써야 할경우가 종종 있다.
그런데 혹시 같은 프로그램이 이미 여러개 떠있어서
ClassName이나 Caption이 같은 윈도우가 여러개 있다면
단지 FindWindow로서 정확히 해당 윈도우를 찾지 못하는경우가 발생하기도 한다.
대개의 경우는 제대로 찾아지는데 이는
방금실행한 폼이 Desktop에 맨앞으로 오기 때문이다.
그렇다면 내가 실행한 application의 윈도우를 정확히 찾으려면 어떻게 해야할까?
방법은?
processid를 이용해서 EnumWindow 프로세서로 넘오오는 HWND의 prossesid와 비교해서 찾을수있다.
아래와 같이
// 참조 http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=53233
|
그럼 이제 실행한 프로그램의 prossesId와 classname을 가지고
WindwoFormProcessId 함수를 호출해주면 된다.
방법 1. CreateProcess 이용
|
방법2. ShellExecute 를 이용하여..
CreateProcess 함수를 이용하면 실행한 program의 processid를 쉽게 알수 있지만
ShellExecute함수를 이용하여서는 processid를 쉽게 알수 없다.
하지만 WinXP 이상에서는 kernel32.dll 에서 GetProcessId 라는 함수가 제공된다.
GetProcessId 함수를 이용하여 ShellExecuteEx 를 이용해서도 processid를 확인할수 있고
정확히 실행한 프로그램의 handle을 확인할수 있다.
예제
// GetProcessId에 대해
// winxp sp1 이상에서 지원 - http://msdn.microsoft.com/en-us/library/aa383886(VS.85).aspx
// GetProcessId함수 설명 - http://msdn.microsoft.com/en-us/library/ms683215(VS.85).aspx
void __fastcall TForm1::Button3Click(TObject *Sender) { String str="calc.exe"; PROCESS_INFORMATION m_pi; SHELLEXECUTEINFO si; ZeroMemory(&si, sizeof(SHELLEXECUTEINFO)); si.cbSize = sizeof(SHELLEXECUTEINFO); si.lpVerb = __TEXT("open"); //mode : print, write si.lpFile = __TEXT("calc.exe"); //실행파일 // si.lpParameters = PathIP; //실행파일 인자값. // shellIP.lpDirectory = //실핼파일 디렉토리. si.nShow = SW_SHOW; //SW_HIDE si.fMask = SEE_MASK_NOCLOSEPROCESS|SEE_MASK_FLAG_DDEWAIT; BOOL bRet = ShellExecuteEx(&si); //성공시 true if(bRet == TRUE) { WaitForInputIdle(si.hProcess, INFINITE); typedef DWORD WINAPI (*TFuncProc)(HANDLE hProcess); TFuncProc GetProcessId; HINSTANCE lib=LoadLibraryA("kernel32.dll"); GetProcessId=(TFuncProc)GetProcAddress(lib,"GetProcessId"); if(GetProcessId) { DWORD pid=GetProcessId(si.hProcess); if(pid != 0) { HWND hwnd = WindowFromProcessID(pid,"SciCalc"); if(si.hwnd==hwnd) ShowMessage("같다"); if(hwnd) { SetPage(hwnd,"SciCalc"); //그냥 무슨 작업을 하는 함수 } } } FreeLibrary(lib); } } |
그럼..
'C & C++ > C & C++' 카테고리의 다른 글
파일 존재유무 파악 (0) | 2011.11.02 |
---|---|
Dialog의 버튼 클릭 기능 SendMessage 보내기 - 프로그램으로 클릭하기 (0) | 2011.11.02 |
레지스터리 값 저장하고 가져오기 (0) | 2011.10.31 |
파일 목록얻기 (0) | 2011.10.26 |
트레이아이콘으로 이동하는 애니메이션 (0) | 2011.10.26 |
댓글