글
Technical Article/펌 2002. 6. 24. 10:14[펌] Internet Explorer의 주소창 Hooking하기
제 목 Internet Explorer의 주소창 Hooking하기
작 성 자 송은희(song82) 첨 부
파 일
작성시간 2002-06-18 오전 11:06:53
조 회 수 151
데브피아의 Q&A에서 찾은 방법으로 작성한 것을 정리해서 올립니다.
여기 예제는 주소창의 Keyboard와 윈도우 Message를 hooking하는 예제입니다.
아래의 변수들을 Global로 선언합니다.
static HHOOK g_hKeyHook = NULL;
static HHOOK g_hMsgHook = NULL;
static HWND g_hAddrComboBox = NULL;
static HWND g_hAddrEdit = NULL;
헤더파일에 다음의 함수를 선언합니다.
// Address Bar hooking
void IEAddressBarHook();
static LRESULT CALLBACK AddrBarKeyHookProc(int nCode, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK AddrBarMsgHookProc(int nCode, WPARAM wParam, LPARAM lParam);
위 세개의 함수 구현은 다음과 같습니다.
void CMyclass::IEAddressBarHook()
{
HWND hwndIEFrame = NULL;
HWND hWorker = NULL;
HWND hComboBoxEx = NULL;
HWND hRebar = NULL;
g_pThis = this;
hwndIEFrame = ::FindWindow("IEFrame", NULL);
if(hwndIEFrame != NULL)
hWorker = ::FindWindowEx(hwndIEFrame, NULL, "WorkerW", NULL);
if(hWorker == NULL)
hWorker = ::FindWindowEx(hwndIEFrame, NULL, "WorkerA", NULL);
if(hWorker != NULL)
hRebar = ::FindWindowEx(hWorker,NULL, "ReBarWindow32", NULL);
hComboBoxEx = ::FindWindowEx(hRebar, NULL, "ComboBoxEx32", NULL);
g_hAddrComboBox = ::FindWindowEx(hComboBoxEx, NULL, "ComboBox", NULL);
g_hAddrEdit = ::FindWindowEx(g_hAddrComboBox, NULL, "Edit", NULL);
g_hKeyHook = SetWindowsHookEx(WH_KEYBOARD,
reinterpret_cast<HOOKPROC>(AddrBarKeyHookProc),
NULL,
::GetCurrentThreadId());
g_hMsgHook = SetWindowsHookEx(WH_GETMESSAGE,
reinterpret_cast<HOOKPROC>(AddrBarMsgHookProc),
NULL,
::GetCurrentThreadId());
}
LRESULT CALLBACK CMyClass::AddrBarKeyHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0)
return CallNextHookEx(g_hKeyHook, nCode, wParam, lParam);
if ((lParam & 0x80000000) || (lParam & 0x40000000))
return CallNextHookEx(g_hKeyHook, nCode, wParam, lParam);
if (wParam == VK_RETURN)
{
// 여기서 주소창에서 엔터키를 사용했을 경우의 처리를 할 수 있습니다.
}
return CallNextHookEx(g_hKeyHook, nCode, wParam, lParam);
}
LRESULT CALLBACK CMyClass::AddrBarMsgHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(((PMSG)lParam)->hwnd == g_hAddrEdit || ((PMSG)lParam)->hwnd == g_hAddrComboBox)
{
if (((PMSG)lParam)->message == WM_PAINT)
{
// 주소창의 내용이 변할때를 인식해 낼 수 있습니다.
}
}
return CallNextHookEx(g_hMsgHook, nCode, wParam, lParam);
}
IEAddressBarHook()함수를 원하는 위치에서 호출해 주면, 상황에 따랄 Callback함수들이 호출되게 됩니다.
주소창 윈도우을 찾아낼 때 FindWindow()함수를 사용했는데요..
확인은 안해 봤지만, classname이 IE의 버전에 따라 차이가 있을수도 있을거 같습니다.
혹, 더 좋은 방법을 알고 계신 분들은 리플 달아주세요. ^^;
[데브피아 펌]
작 성 자 송은희(song82) 첨 부
파 일
작성시간 2002-06-18 오전 11:06:53
조 회 수 151
데브피아의 Q&A에서 찾은 방법으로 작성한 것을 정리해서 올립니다.
여기 예제는 주소창의 Keyboard와 윈도우 Message를 hooking하는 예제입니다.
아래의 변수들을 Global로 선언합니다.
static HHOOK g_hKeyHook = NULL;
static HHOOK g_hMsgHook = NULL;
static HWND g_hAddrComboBox = NULL;
static HWND g_hAddrEdit = NULL;
헤더파일에 다음의 함수를 선언합니다.
// Address Bar hooking
void IEAddressBarHook();
static LRESULT CALLBACK AddrBarKeyHookProc(int nCode, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK AddrBarMsgHookProc(int nCode, WPARAM wParam, LPARAM lParam);
위 세개의 함수 구현은 다음과 같습니다.
void CMyclass::IEAddressBarHook()
{
HWND hwndIEFrame = NULL;
HWND hWorker = NULL;
HWND hComboBoxEx = NULL;
HWND hRebar = NULL;
g_pThis = this;
hwndIEFrame = ::FindWindow("IEFrame", NULL);
if(hwndIEFrame != NULL)
hWorker = ::FindWindowEx(hwndIEFrame, NULL, "WorkerW", NULL);
if(hWorker == NULL)
hWorker = ::FindWindowEx(hwndIEFrame, NULL, "WorkerA", NULL);
if(hWorker != NULL)
hRebar = ::FindWindowEx(hWorker,NULL, "ReBarWindow32", NULL);
hComboBoxEx = ::FindWindowEx(hRebar, NULL, "ComboBoxEx32", NULL);
g_hAddrComboBox = ::FindWindowEx(hComboBoxEx, NULL, "ComboBox", NULL);
g_hAddrEdit = ::FindWindowEx(g_hAddrComboBox, NULL, "Edit", NULL);
g_hKeyHook = SetWindowsHookEx(WH_KEYBOARD,
reinterpret_cast<HOOKPROC>(AddrBarKeyHookProc),
NULL,
::GetCurrentThreadId());
g_hMsgHook = SetWindowsHookEx(WH_GETMESSAGE,
reinterpret_cast<HOOKPROC>(AddrBarMsgHookProc),
NULL,
::GetCurrentThreadId());
}
LRESULT CALLBACK CMyClass::AddrBarKeyHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0)
return CallNextHookEx(g_hKeyHook, nCode, wParam, lParam);
if ((lParam & 0x80000000) || (lParam & 0x40000000))
return CallNextHookEx(g_hKeyHook, nCode, wParam, lParam);
if (wParam == VK_RETURN)
{
// 여기서 주소창에서 엔터키를 사용했을 경우의 처리를 할 수 있습니다.
}
return CallNextHookEx(g_hKeyHook, nCode, wParam, lParam);
}
LRESULT CALLBACK CMyClass::AddrBarMsgHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(((PMSG)lParam)->hwnd == g_hAddrEdit || ((PMSG)lParam)->hwnd == g_hAddrComboBox)
{
if (((PMSG)lParam)->message == WM_PAINT)
{
// 주소창의 내용이 변할때를 인식해 낼 수 있습니다.
}
}
return CallNextHookEx(g_hMsgHook, nCode, wParam, lParam);
}
IEAddressBarHook()함수를 원하는 위치에서 호출해 주면, 상황에 따랄 Callback함수들이 호출되게 됩니다.
주소창 윈도우을 찾아낼 때 FindWindow()함수를 사용했는데요..
확인은 안해 봤지만, classname이 IE의 버전에 따라 차이가 있을수도 있을거 같습니다.
혹, 더 좋은 방법을 알고 계신 분들은 리플 달아주세요. ^^;
[데브피아 펌]
![](https://lh3.googleusercontent.com/-hYZb_novCPQ/V5HuGPkGFUI/AAAAAAAAANk/f8zcKkeTBbA1A-W6yuqfk12fs8bd8FeOQCL0B/banner_468_60.png)
RECENT COMMENT