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
[53243] Re:Re:Re:Re:EnumWindows실행 후 EnumChildWindows실행 시 오류
와일드오키드 [wildorchid] 2156 읽음    2008-04-24 09:31
답변 감사하구요

일단은 아래 형태로 바꿔서 작동하게 하긴 했는데

영 꺼림칙 하네요.

즐거운 하루 되세요.

                        while(1) {
                            Application->ProcessMessages();
                            EnumChildWindows( hwnd, (WNDENUMPROC)EnumChildProc, (LPARAM)&hWndChild );
                            if(hWndChild != 0)
                                break;
                        }


장성호 님이 쓰신 글 :
: 역시 해답은 아닙니다만...
: WindowFromProcessID 뒤에
: GetForegroundWindow 함수로 찾은 HWND와 IEFrame이 같을때까지 기다리고
: 그후에 Sleep을 2초 주니까 항상 찾아지더군요
: 제 pc에서는
:
: 즉 IEFrame이 Active된후에 한 2초 정도면 "Internet Explorer_Server"까지 거의 초기화 된다고 보고....
:
: 아래 코드처럼...
:
:                WaitForInputIdle(m_pi.hProcess, INFINITE);
:                 if(m_pi.dwProcessId != 0) {
:                     HWND hWndChild = NULL;
:                     HWND hwnd = WindowFromProcessID(m_pi.dwProcessId);
:                     while(hwnd)
:                     {
:                         HWND bAtvWnd=GetForegroundWindow();
:                         if(hwnd==bAtvWnd)break;
:                         Sleep(10);
:                     };
:                     Sleep(2000);
:
:                     EnumChildWindows( hwnd, (WNDENUMPROC)EnumChildProc, (LPARAM)&hWndChild );
:
: 그럼...
:
:
: 와일드오키드 님이 쓰신 글 :
: : 저도 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);
: : : :     }
: : : : }
: : : : //---------------------------------------------------------------------------

+ -

관련 글 리스트
53226 EnumWindows실행 후 EnumChildWindows실행 시 오류 와일드오키드 3064 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.