저도 Sleep을 넣어 테스트 해봤는데 1000을 주더 될때 있고
안될때 있고 3000을줘도 될때 있고 안될때 있고 하네요..미챠 ㅡ,.ㅡ;
장성호 님이 쓰신 글 :
: 정확한 해답은 아닙니다만
:
: 참고로..
:
: WaitForInputIdle(m_pi.hProcess, INFINITE); //여기에서요
: 프로세서가 완전치 초기화 되었다고 해서
: "Internet Explorer_Server" 까지 생성되었다는것은 아닌것 같습니다.
:
: 제 pc에선 WaitForInputIdle뒤에 Sleep(2000); 정도 주니까 찾아지던데...
:
: WaitForInputIdle(m_pi.hProcess, INFINITE);
: Sleep(2000);
:
: ...
:
: 그럼..
:
: 와일드오키드 님이 쓰신 글 :
: : 안녕하세요. 항상 좋은 내용들 잘보고 있는 눈팅족입니다.
: :
: : 다름이 아니라 요상(?) 한 현상이 있어서 글을 씁니다.
: :
: : 제가 프로그램을 하나 만들었습니다.
: :
: : 작동 순서는
: :
: : 1. 프로그램 실행
: : 2. IE를 실행
: : 3. 프로그램에서 실행 한 IE인지 판단.
: : 4. 실행 한 IE의 내부에 있는 "Internet Explorer_Server" 클래스명을 가지고 있는 윈도우 핸들을 찾는다.
: :
: : 이런 건데요.
: :
: : 아래 소스에도 있습니다
: :
: : (1) HWND hwnd = WindowFromProcessID(m_pi.dwProcessId);
: : (2) EnumChildWindows( hwnd, (WNDENUMPROC)EnumChildProc, (LPARAM)&hWndChild );
: :
: : 그런데 (1)과 (2)를 바로 실행 시키면 찾지를 못하구요.
: :
: : (2)에 브레이크 걸었다가 실행시키면 찾는 현상이 발생합니다.
: :
: : 중간에 어떤 대기 효과가 있는 걸 넣어야 되는건지 원래 그리해야되는건지...
: :
: : 읽어주셔서 감사합니다.
: :
: :
: :
: : 소스입니다.
: : //---------------------------------------------------------------------------
: :
: : #include <vcl.h>
: : #pragma hdrstop
: :
: : #include <mshtml.h>
: : #include <atl\atlbase.h>
: : #include <oleacc.h>
: : #include <Exdisp.h>
: :
: : typedef struct _PIDANDHWND{
: : DWORD pID;
: : HWND hWindow;
: : } PIDANDHWND;
: :
: : PROCESS_INFORMATION m_pi;
: :
: : #include "Unit1.h"
: :
: : //---------------------------------------------------------------------------
: : #pragma package(smart_init)
: : #pragma resource "*.dfm"
: : TForm1 *Form1;
: : //---------------------------------------------------------------------------
: : //---------------------------------------------------------------------------
: : BOOL CALLBACK EnumWindowsProc(HWND hWindow, PIDANDHWND *lParam)
: : {
: : char sClass[513] = { 0, };
: : char sCaption[1025] = { 0, };
: :
: : GetClassName( hWindow, sClass, 512 );
: :
: : if( strcmp( sClass, "IEFrame" ) == 0 )
: : {
: : lParam->hWindow = hWindow;
: : return FALSE;
: : }
: : else
: : return TRUE;
: :
: : }
: :
: : BOOL CALLBACK EnumChildProc( HWND hWnd, LPARAM lParam )
: : {
: : TCHAR buf[100];
: :
: : ::GetClassName( hWnd, (LPTSTR)&buf, 100 );
: : if ( _tcscmp( buf, _T("Internet Explorer_Server") ) == 0 )
: : {
: : *(HWND*)lParam = hWnd;
: : return FALSE;
: : }
: : else
: : return TRUE;
: : }
: :
: : HWND WindowFromProcessID(DWORD pID)
: : {
: : PIDANDHWND Param;
: :
: : Param.pID = pID;
: : Param.hWindow = 0;
: : EnumWindows((WNDENUMPROC)EnumWindowsProc, (LPARAM)&Param);
: : return Param.hWindow;
: : }
: : //---------------------------------------------------------------------------
: : void __fastcall TForm1::FormCreate(TObject *Sender)
: : {
: : STARTUPINFO si;
: :
: : GetStartupInfo(&si);
: :
: : si.cb = sizeof(STARTUPINFO);
: : si.dwFlags = STARTF_USESHOWWINDOW;
: : si.wShowWindow = SW_SHOW;
: :
: : HKEY hkey;
: : LONG ReturnValue=RegOpenKeyEx(HKEY_LOCAL_MACHINE
: : ,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\IEXPLORE.EXE"
: : ,0, KEY_ALL_ACCESS,&hkey);
: :
: : if(ReturnValue==ERROR_SUCCESS)
: : {
: : DWORD dwType;
: : DWORD dwSize = 200;
: : char szString[255];
: :
: : LONG lReturn = RegQueryValueEx (hkey, "", NULL,&dwType, (BYTE *)szString, &dwSize);
: : if(lReturn == ERROR_SUCCESS )
: : {
: : RegCloseKey(hkey);
: : String str;
: :
: : str.sprintf("%s", szString);
: : str += "
http://www.yahoo.or.kr";
: :
: : BOOL bRet = CreateProcess (NULL, str.c_str(), NULL, NULL, true, NORMAL_PRIORITY_CLASS
: : , NULL, NULL, &si, &m_pi);
: : if(bRet == TRUE) {
: : WaitForInputIdle(m_pi.hProcess, INFINITE);
: :
: : if(m_pi.dwProcessId != 0) {
: : HWND hWndChild = NULL;
: : HWND hwnd = WindowFromProcessID(m_pi.dwProcessId);
: : EnumChildWindows( hwnd, (WNDENUMPROC)EnumChildProc, (LPARAM)&hWndChild );
: : if(hWndChild != 0) {
: : MessageBox(NULL, "IE find", "", MB_OK);
: : }
: : }
: : }
: : }
: : }
: : else {
: : MessageBox(NULL, "Error", "", MB_OK);
: : }
: : }
: : //---------------------------------------------------------------------------