이게 아직도 되려나??
====== 훅 Hook ======
* [[http://msdn.microsoft.com/ko-kr/library/ms644959.aspx|official help]]
* 메시지,이벤트(?),마우스액션,키보드입력을 가로채는 방법
====== hook chains ======
* 훅은 종류별로 나누어져 있다.
* 종류별로 훅체인을 유지
* 훅 체인은 콜백함수(Hook Procedure)의 포인터 리스트.
* 각 메시지는 훅 체인에 연결된 함수들을 차례대로 거치게 된다.
* 훅에 종류에 따라 모니터링만 가능한 것도 있다.
* 이런 훅은 다음 훅프로시져를 부르지 않아도, 자동으로 시스템이 다음 훅프로시져로를 사용한다.
* 메시지 조작이 가능한 경우, 다음 체인으로 가는 것을 막을 수도 있다.
====== Hook Procedures ======
* [[http://msdn.microsoft.com/ko-kr/library/ms644990.aspx|SetWindowsHookEx()]] 함수로 설치 가능
* HookProc는 아래 형식을 사용해야 함
LRESULT CALLBACK HookProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
// process event
//...
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
===== HookProc의 파라미터 =====
* nCode : 훅코드. 훅코드는 훅 종류에 따라 메시지가 틀려진다
* wParam / lParam : 뭐 당근
===== HookProc의 특성 =====
* SetWindowsHookEx 로 훅을 설치하면, 훅 체인의 가장 1번으로 설정된다.
* CallNextHookEx 를 호출함으로 다음번 훅 체인의 함수가 실행된다.
* 모니터링만 가능한 훅의 경우, CallNextHookEx를 호출하지 않아도 다음 차례의 훅이 실행된다.
* GlobalHook 은 모든 쓰레드에 훅을 건다.
* 모든 쓰레드에서 임의 호출되도록 dll 타입으로 제작된다.
====== Hook Types ======
===== WH_CALLWNDPROC and WH_CALLWNDPROCRET =====
* 윈도우즈 프로시져에 넘어가는 메시지를 모니터링할 수 있도록 훅을 건다.
* WH_CALLWNDPROC 는 프로시져가 불리기 전에 호출
* WH_CALLWNDPROCRET 는 프로시져에서 메시지를 처리한 후에 호출
* CWPRETSTRUCT 구조체를 파라미터로 넘긴다. 이 구조체는 메시지 사용후 변경된 값이 들어가 있다.
* 참고
* [[http://msdn.microsoft.com/ko-kr/library/ms644975.aspx|CallWndProc]]
* [[http://msdn.microsoft.com/ko-kr/library/ms644976.aspx|CallWndRetProc]]
==== WH_CBT ====
* 시스템 콜에 관련된 메시지
* 윈도우 활성/생성/삭제/축소/확대/이동/크기조절
* 시스템 커맨드가 완료되기 전
* 마우스,키보드 이벤트 메시지가 삭제 되기 전
* 입력 포커스가 가기 전
* 시스템 메시지가 동기화 되기 전
* 이 훅의 리턴값은, 해당 메시지를 실행할 것인지 무시할 것인지 결정 할 수 있다.
==== WH_DEBUG ====
* 다른 훅을 부르기 전에 호출된다. 훅 디버깅을 위한 훅
==== WH_FOREGROUNDIDLE ====
* 훅을 설치한 어플리케이션이 idle 상태가 되면 호출한다.
==== WH_GETMESSAGE ====
* GetMessage / PeekMessage가 리턴한 메시지를 모니터링한다.
==== WH_JOURNALPLAYBACK ====
* 어플리케이션이 시스템 메시지 큐에 임의의 메시지를 입력하도록 합니다.
* WH_JOURNALRECORD 가 저장한 입력 이벤트드를 다시 리플레이.
* global hook 이므로 dll로 제작 필요. 특정 쓰레드만 대상으로는 사용 불가.
==== WH_JOURNALRECORD ====
==== WH_KEYBOARD_LL ====
* 키보드 입력을 모니터링
==== WH_KEYBOARD ====
* WM_KEYDOWN, WM_KEYUP 메시지를 모니터링.
* GetMessage / PeekMessage 함수의 리턴값
==== WH_MOUSE_LL ====
==== WH_MOUSE ====
==== WH_MSGFILTER , WH_SYSMSGFILTER ====
* 메뉴,스크롤바,메시지박스,대화상자의 메시지를 가로채어 모니터링
* alt+tab,alt+esc 단축키가 눌렸을때 발생되는 이벤트도 모니터링
* 키를 누른 시점을 안다는 것인지, 결과를 안다는것인지 모호
* WH_MSGFILTER : 훅을 설치한 어플리케이션에서 실행된 어플리케이션을 모니터링
* WH_SYSMSGFILTER : 모든 어플리케이션 모니터링
==== WH_SHELL ====
* 새 윈도우가 생성되거나 삭제되는 경우의 이벤트를 모니터링
* custom 쉘 어플리케이션은 WH_SHELL 메시지를 받지 않으므로 SystemParametersInfo 를 사용해서 새로운 쉘로 등록하기 전에 WH_SHELL을 처리할 수 있도록 해두어야 한다.
===== Hook 범위 =====
| Hook | Scope |
| WH_CALLWNDPROC | Thread or global |
| WH_CALLWNDPROCRET | Thread or global |
| WH_CBT | Thread or global |
| WH_DEBUG | Thread or global |
| WH_FOREGROUNDIDLE | Thread or global |
| WH_GETMESSAGE | Thread or global |
| WH_JOURNALPLAYBACK | Global only |
| WH_JOURNALRECORD | Global only |
| WH_KEYBOARD | Thread or global |
| WH_KEYBOARD_LL | Global only |
| WH_MOUSE | Thread or global |
| WH_MOUSE_LL | Global only |
| WH_MSGFILTER | Thread or global |
| WH_SHELL | Thread or global |
| WH_SYSMSGFILTER | Global only |
====== Using Hooks ======
* [[http://msdn.microsoft.com/ko-kr/library/ms644960.aspx|도움말]]
* 예제가 나와 있으므로 정리하지 않아도 될듯