[Win32 API] 익스플로러의 차일드윈도우 가져오기

dotri의 이미지

이스트소프트의 "알패스"라는 프로그램을 아십니까? 특정 웹페이지에 접속하면 아이디와 패스워드를 자동으로 입력해주는 써드파티 프로그램입니다. 그것과 같은 기능을 하는 프로그램을 만들어볼려고 애쓰는 중이구요, MFC 는 안쓰고 순수 ANSI-C 와 Win32 SDK 만으로 코딩합니다.

상황은 이렇습니다.
1) 주소입력창(첨부그림중 상단 빨간색부분)의 핸들을 가져오는것은 성공했으나, 그 핸들로 GetWindowText() 함수를 수행하면 내용을 읽을 수 없습니다. 이 문제에 대해서는 아래의 소스코드를 참조해주세요.
2) Spy++로 확인해보니 익스플로러의 클라이언트영역(첨부그림중 커다란 까만색부분)은 통채로 Internet Explorer_Server 라는 이름의 클래스로 등록되어 있는데요, 정작 그 안에 위치하는 차일드(아이디와 패스워드 입력하는 부분)는 그 핸들을 얻을수가 없습니다. Spy++로 찍어봐도 까만색부분만 잡히고, 그 안에 차일드컨트롤은 검출이 안되네요. 어떤 방법으로 접근할 수 있을까요?

조언 바랍니다. 다음 소스코드는 질문1) 에 나타나는 현상을 보인것입니다. 익스플로러를 켠 상태에서 실행해보시면 뭐가 문제인지 알 수 있으실겁니다.

#include <windows.h>

BOOL CALLBACK EnumProc( HWND hWnd, LPARAM lParam ); // 익스플로러를 찾는 콜백함수
BOOL CALLBACK EnumChildProc( HWND hWnd, LPARAM lParam ); // 차일드컨트롤중에 Edit 컨트롤를 찾는 콜백함수

int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
	EnumWindows( EnumProc, 0 ); // 현재 열려있는 모든 윈도우를 순차검색한다.

	return 0;
}

BOOL CALLBACK EnumProc( HWND hWnd, LPARAM lParam )
{
	char sClass[513] = { 0, };

	// 이 윈도우가 익스플로러인가? 그렇다면 그 차일드컨트롤을 순차검색한다.
	GetClassName( hWnd, sClass, 512 );
	if( strcmp( sClass, "IEFrame" ) == 0 )
		EnumChildWindows( hWnd, EnumChildProc, 0 );

	return TRUE;
}

BOOL CALLBACK EnumChildProc( HWND hWnd, LPARAM lParam )
{
	char sClass[513] = { 0, };
	char sCaption[1025] = { 0, };

	// 차일드컨트롤의 클래스를 보고
	GetClassName( hWnd, sClass, 512 );
	
	// 에디트컨트롤이라면 그 내용을 읽어온다.
	if( strcmp( sClass, "Edit" ) == 0 )
	{
		GetWindowText( hWnd, sCaption, 1024 );
		MessageBox( NULL, sCaption, sClass, 0 );
	}

	return TRUE;
}

윈도우 전체에 익스플로러가 1개 실행중이고, 그 익스플로러가 http://www.google.com 페이지를 연 상태라면 예상되는 결과는 "http://www.google.com" 이 되어야 할것 같습니다만.. 실제로는 그렇게 동작하지 않습니다.

File attachments: 
첨부파일 크기
Image icon daum.jpg140.72 KB
익명 사용자의 이미지

윈도우 쪽은 하도 오래 되놔서 잘 기억은 안나지만, 이런경우 윈도우 자체에 접근해서 알아내는 것보다는 ActiveX쪽의 interface를 사용하는게 간편하지 않나요?

corba의 이미지

저도 자세히는 모릅니다만 보통 저런 프로그램은 COM을 이용해서 익스플로러 플러그인으로 만들어야 하는 것으로 알고 있습니다.
그렇게 하면 특정 사이트가 로드되는 시점, URL 그리고 HTML Document인터페이스를 얻을 수 있는 걸로 알구요.
어차피 HTML의 Input쪽에 값을 쓰시려면 IHTMLDocument인터페이스를 이용하셔야 할겁니다.
지금 접근하고 계신 방법으론 힘들 것 같네요.

mirr의 이미지

음...파이어폭스에서 지원하는 비밀번호 저장기능같은거랑은 전혀 다른건가요?? ^^

내 마음속의 악마가 자꾸만 나를 부추겨.
늘 해왔던 것에 만족하지 말고 뭔가 불가능해 보이는 것을 하라고 말야.

chadr의 이미지

예전에 저도 비슷한 프로그램을 작성해봤습니다.. 그때 저도 무작정 자식윈도우의 핸들로 텍스트를 읽을려고 했는데 잘 안되더군요.. :(

BHO(Browser Helper Object)로 구글링을 하시거나 데브피아에서 검색하시면 나올겁니다..

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

익명사용자의 이미지

까만창 안쪽은 IE의 영역이지, 윈도우 영역이 아니기 때문인 듯...

vishnu76의 이미지

IE 영역에 보이는 컨트롤이 윈도 컨트롤 처럼 보이지만 윈도 컨트롤이 아닙니다. 따라서 일반 윈도 함수로 접근 불가. IE의 IWebBrowser2 객체를 가져올 수 있으면, 여기에서 HTML 노드의 형식 값등을 알아낼수 있습니다. 이렇게 하시면 될 듯 하네요.

klenui의 이미지

1번 관련해서 아래 코드 추가해 보세요.

if ( strcmp( sClass, "ComboBoxEx32" ) == 0 )
{
int count = SendMessage(hWnd, CB_GETCOUNT, 0, 0);
int size = SendMessage(hWnd, CB_GETLBTEXTLEN, 0, 0);
if ( size > 0 )
{
TCHAR* lpszBuffer = new TCHAR[size+1];
SendMessage(hWnd, CB_GETLBTEXT, 0, (LPARAM)lpszBuffer);
MessageBox( NULL, lpszBuffer, sClass, 0 );
delete[] lpszBuffer;
}
}

근데 코드는 어떻게 tag를 달아 줘야되나요..?
다른 분들은 wiki같이 code 지정 tag쓰시는 것 같던데....

sinmusa의 이미지

저도 7일째 삽질중입니다
이문제 하나 때문에 다른언어를 또배운다는거는 너무 가혹한일 같아요 ㅠㅠ

<에이다의 저주>

익명 사용자의 이미지

제가봐도 id/pw 부분은 차일드 윈도우가 아니라 순수 html 페이지라서 그런것같습니다.
검은색 테두리 하나가 웹html을 뿌려주는 윈도우인듯싶습니다.
즉 저 검은색 테두리 안에서 읽어오는 html소스를 분석해서
javascript부분의 id/pw 파라미터를 찾고 그부분의 파라미터에 값을 입력하도록 하면 되지 않을까요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.