안녕하세요. 항상 좋은 내용들 잘보고 있는 눈팅족입니다.
다름이 아니라 요상(?) 한 현상이 있어서 글을 씁니다.
제가 프로그램을 하나 만들었습니다.
작동 순서는
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);
}
}
//---------------------------------------------------------------------------