C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[53226] EnumWindows실행 후 EnumChildWindows실행 시 오류
와일드오키드 [wildorchid] 3063 읽음    2008-04-23 12:58
안녕하세요. 항상 좋은 내용들 잘보고 있는 눈팅족입니다.

다름이 아니라 요상(?) 한 현상이 있어서 글을 씁니다.

제가 프로그램을 하나 만들었습니다.

작동 순서는

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);
    }
}
//---------------------------------------------------------------------------

+ -

관련 글 리스트
53226 EnumWindows실행 후 EnumChildWindows실행 시 오류 와일드오키드 3063 2008/04/23
53229     Re:EnumWindows실행 후 EnumChildWindows실행 시 오류 장성호 2408 2008/04/23
53230         Re:Re:EnumWindows실행 후 EnumChildWindows실행 시 오류 와일드오키드 1872 2008/04/23
53233             Re:Re:Re:EnumWindows실행 후 EnumChildWindows실행 시 오류 장성호 2887 2008/04/23
53243                 Re:Re:Re:Re:EnumWindows실행 후 EnumChildWindows실행 시 오류 와일드오키드 2156 2008/04/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.