IE 훅킹 혹은 가로채기. 강좌
/*
윈도우 내 맘대로 다루기에서 잠깐 다루었지만 보충합니다.
먼저 강좌에서와 같이 오토핫키를 이용합니다.
오토핫키는 사용해 보면 자바스크립트와 닮았습니다.
자바 스크립트가 웹페이지를 풍부하게 한다면 오토핫기키는 윈도우를 풍성하게 합니다.
오토핫키를 이용하여 오토핫키와 자바스크립트를 결합시켜 보겠습니다.
*/
#NoEnv
#Persistent
#SingleInstance, force
DetectHiddenWindows, On
Process, Priority, , High
SetBatchLines, -1
SetWinDelay, 0
SetControlDelay, 0
;창 생성 및 활성화 감시
Gui, +LastFound
DllCall( "RegisterShellHookWindow", UInt, WinExist() )
MsgNum := DllCall( "RegisterWindowMessage", Str, "SHELLHOOK" )
OnMessage( MsgNum, "ShellMessage" )
Return
ShellMessage( wParam,lParam )
{
Global Url
If wParam = 6
{
ControlGetText, Url, Edit1, ahk_id %lParam%
If Url Contains http
{
Gosub, InjectScript
ControlFocus, Internet Explorer_Server1, ahk_id %lParam%
}
}
}
;웹페이지 인터페이스하기
GetWebrouser()
{
Static Msg := DllCall("RegisterWindowMessage", "str", "WM_HTML_GETOBJECT")
SendMessage Msg, 0, 0, Internet Explorer_Server1, ahk_class IEFrame
lResult := ErrorLevel
DllCall("oleacc\ObjectFromLresult", "ptr", lResult
, "ptr", GUID(IID_IHTMLDocument2,"{332C4425-26CB-11D0-B483-00C04FD90119}")
, "ptr", 0, "ptr*", pdoc)
ComObjError(false)
Static IID_IHTMLWindow2 := "{332C4427-26CB-11D0-B483-00C04FD90119}"
Pwin := ComObjQuery(pdoc, IID_IHTMLWindow2, IID_IHTMLWindow2)
ObjRelease(pdoc)
Static VT_DISPATCH := 9, F_OWNVALUE := 1
Return ComObject(VT_DISPATCH, Pwin, F_OWNVALUE)
}
GUID(ByRef GUID, sGUID)
{
VarSetCapacity(GUID, 16, 0)
return DllCall("ole32\CLSIDFromString", "wstr", sGUID, "ptr", &GUID) >= 0 ? &GUID : ""
}
/*
ie유저 사용자를 위한 것입니다.
firefox 사용자라면 이미 웹페이지를 자유자재로 다룰 수 있으니 이런 과정이 필요없겠죠.
본인은 ie만 사용하므로 이런 과정이 필요합니다.
ie유저에게도 trixie ietoy ie7pro 등이 있어 웹페이지를 직접 다룰 수 있었지만 ie9를 사용하고부턴 전혀 사용해 본적이 없어 ie9에서도 적용되는지 여부는 모르겠습니다.
위의 코드를 짧게나마 설명합니다.
웹페이지 인터페이스하기 혹은 구하기는 함수입니다. 그래서 따로 독립시킨다음
#include 함수파일이름 해도 되고 오토핫키 디폴도 lib 파일에 저장해 놓으면 #include 필요없이 자동으로 읽어 들입니다.
9번째 줄 return까지 자동 실행영역입니다. 바로 위줄 onmessage에서 메세지 감시를 걸었습니다.
이 명령어에 의해서 조건 성립시 위 스크립트는 계속해서 함수 ShellMessage를 실행합니다.
이중에서 wParam = 6 조건 성립시 ie 인터페이스를 구해 사용자 것으로 만든 것입니다.
더 좋은 방법은 잘 모르겠습니다. 조건 wParam = 6으로 했을 경우 본인으로선 여태까지 불편이 없었으므로 현재까지도 사용합니다.
위 스크립트만으로 아무런 작업도 할 수 없거나 에러메시지가 발생할것입니다.
이유는 ShellMessage 함수내에 gosub, InjectScript 명령줄에서 InjectScript을 만들지 않았기 때문입니다.
gosub 명령어는 함수와 유사합니다.
지정한 injectScript를 실행하고 돌아와서 다음 명령줄을 계속 이행합니다.
예시에서는 ControlFocus, Internet Explorer_Server1, ahk_id %lParam% 이 되겠네요.
이 명령어는 없어도 되는 것으로 무엇을 하냐면 간혹 어떤 웹사이트들이 로딩시 포커스를 자기 맘대로 주소표시줄이나 그런 것으로 하여 본인이 불편하여 항시 웹페이지에 포커스를 두도록 한 명령어입니다.
*/
;자 이제 InjectScript를 만듭니다.
;명령어와 주석(설명문)을 구분하기 위해 주석에는 오코핫키 주석처리 ;를 혹은 다중줄 /*주석*/덧붙이겠습니다.
InjectScript:
;여기와서 ie를 사용자 것으로 만들어 버립니다.
Pwin := GetWebrouser()
/*
Pwin이란 무엇이란 무엇이냐 하면 자바스크립트에서 윈도우 객체라고 생각하면 됩니다.
Pwin대신에 GetWebrouser()함수내에서 pweb구하여 pweb을 리턴시킬수도 있습니다.
여기서는 pwin이므로 pwin만 설명합니다
Pwin이 자바스크립트 윈도우 객체이므로 윈도우에 객체에 속한 모든 자바스크립트가 사용 가능하며 동일합니다.
http://www.w3schools.com/js/default.asp 자바스크립트 모든 것이 이용가능합니다.
단지 window 대신 Pwin이 쓰이는 것이죠.
window.alert("안녕");
대신
Pwin.alert("안녕")하면 되겠습니다.
*/
Pwin.alert("안녕")
Return ;여기서 리턴을 만나 최초 gosub으로 돌아가 그 다음줄을 실행해 나간다.
;자 여기까지 잘 따라 오셨다면 ie가 새로 실행되거나 혹은 로딩 될때마다 안녕이라는 메세지를 볼 수 있을 것입니다.
/*
이제 이 스크립트를 통해 다양한 웹페이지에 특화된 userscript를 사용하고 싶다면.
global Url이 이용하면 되겠습니다.
global 이 뭐냐면 전역변수선언입니다.
전역변수는 뭐냐면 변수를 어디에서나 사용할 수 있다는 말입니다.
오토핫키는 기본적으로 선언없이도 전역입니다. 함수내에서 사용하였기에 global 선언을 하여 전역화하였습니다.
웹브라우저가 새 페이지를 로딩할때마다 그 주소를 url이라는 변수에 담아 놓았습니다.
따라서 특정 페이지가 로딩될때 자바 스크립트를 삽입하고 싶으면 다음과 같이 하면 되겠습니다.
*/
Pwin := GetWebrouser()
If url contains daum.net
{
Pwin.alert(" 안녕 " )
}
if Url Contains youtube.com/watch
{
Pwin.alert(" 나 압구정 날라리야")
}
return
/*
몇가지 예시를 더 들자면.
Pwin.document.createStyleSheet().cssText := " [id^='nad_'] {dispay:none !important;}"
css삽입입니다.
css삽입 다른 방법
MyCSSFILE := "file:///D:/포터블 프로그램/MyCSSFILE.css"
Pwin.document.createStyleSheet(MyCSSFILE)
스크립트 언어 삽입
JSCODE =
(
alert("이런 방법도 있어");
)
Pwin.execScript(JSCODE)
*/