// 그냥 무식하게 실행후 일정시간동안 EnumWindows 등으로 뒤지던가
// FindWindow로 캡션과 클래스명을 이용하여 찾는 방법도 있겟으나,
// 윈도우 명과 클래스 명이 같은 경우 엉뚱한 것을 찾을 수 있다.
// 다음과 같이 쉘원도우즈 인터페이스를 이용하여 웹브라우져 컨트롤 인터페이스를 구한후
// GetWindowThreadProcessId를 통해 구해진 값과 CreateProcess실행시의 pid값을 비교하여 찾을 수 있다.
// 깔끔한 SDK 소스~~~
#define _WIN32_DCOM
#include <windows.h>
#include <tchar.h>
#include <atlbase.h> // 이하 5줄은 ATL, COM 관련 헤더화일들 및 전역 객체
extern CComModule _Module; // _Module이름을 바꾸면 안 됨
#include <atlcom.h>
#include <atlhost.h>
CComModule _Module;
HINSTANCE g_hInst;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpcmdLine, int nShowCmd)
{
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
g_hInst = hInstance;
TCHAR szCmd[]=_T("C:\\Program Files\\Internet Explorer\\iexplore.exe http://movie.naver.com/");
STARTUPINFO si={0};
PROCESS_INFORMATION pi={0};
BOOL bRes=CreateProcess(NULL, szCmd, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
if(bRes==FALSE) goto FinishingPoint;
Sleep(1000); // 슬립을 주지 않으면 생성되기 전에 먼저 아래 코드가 빨리 지나가버린다.
{
IShellWindows *pShellWindows=NULL;
IWebBrowser2 *pWebBrowser=NULL;
IDispatch *pDisp=NULL;
HWND hWnd=NULL;
long i, lCount=0;
VARIANT varIndex;
varIndex.vt=VT_I4; // 4바이트 롱형
DWORD pid;
BOOL bSuc=FALSE;
if(S_OK == CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL,
IID_IShellWindows, (void**)&pShellWindows)){
if(S_OK == pShellWindows->get_Count(&lCount)){
for(i=0 ; i<lCount ; i++){
varIndex.lVal=i;
if(S_OK == pShellWindows->Item(varIndex, &pDisp)){
if(S_OK == pDisp->QueryInterface(IID_IWebBrowser2, (void**)&pWebBrowser)){
if(S_OK == pWebBrowser->get_HWND((long*)&hWnd)){
if(GetWindowThreadProcessId(hWnd, &pid)){
if(pid == pi.dwProcessId){
bSuc = 1;
MessageBoxA(hWnd, "Good job!!!", "success", MB_OK);
pDisp->Release();
break;
}
}
}
pWebBrowser->Release();
}
pDisp->Release();
}
}
}
pShellWindows->Release();
}
if(bSuc){
TCHAR szStr[256]={0};
wsprintf(szStr, _T("타겟 인터넷익스플로러의 핸들은 0X%08X입니다."), hWnd);
MessageBox(hWnd, szStr, _T("성공"), MB_OK);
VARIANT varUrl, varEmpty;
varUrl.vt=VT_BSTR, varEmpty.vt=VT_EMPTY;;
BSTR bstrUrl=SysAllocString(L"http://www.google.co.kr");
varUrl.bstrVal=bstrUrl;
pWebBrowser->Navigate2(&varUrl, &varEmpty, &varEmpty, &varEmpty, &varEmpty);
SysFreeString(bstrUrl);
pWebBrowser->Release();
} else {
MessageBoxA(NULL, "찾지 못했습니다.", "실패", MB_OK);
}
}
FinishingPoint:
CoUninitialize();
return 0;
}
'웹, HTML' 카테고리의 다른 글
Handling HTML Element Events (0) | 2009.07.05 |
---|---|
html 로딩 이벤트 관련 글 펌 (1) | 2009.07.04 |
자동로그인 소스 참조 (1) | 2009.07.04 |
WinINet을 이용하여 HTTPS로 POST하는방법? 데브피아 (0) | 2009.07.04 |
참조 윈아이넷 자동로그인 관련 참조. (1) | 2009.07.04 |
Discover WEB. HTTP GET-POST Utility (0) | 2009.07.04 |
자동로그인 포스트 방식 참조 (1) | 2009.07.04 |