SetWindowsHookExW 함수(winuser.h)
후크 체인에 애플리케이션 정의 후크 프로시저를 설치합니다. 후크 프로시저를 설치하여 특정 유형의 이벤트에 대한 시스템을 모니터링합니다. 이러한 이벤트는 특정 스레드 또는 호출 스레드와 동일한 데스크톱의 모든 스레드와 연결됩니다.
통사론
HHOOK SetWindowsHookExW(
[in] int idHook,
[in] HOOKPROC lpfn,
[in] HINSTANCE hmod,
[in] DWORD dwThreadId
);
매개 변수
[in] idHook
형식: int
설치할 후크 프로시저의 유형입니다. 이 매개 변수는 다음 값 중 하나일 수 있습니다.
값 | 의미 |
---|---|
|
시스템에서 메시지를 대상 창 프로시저로 보내기 전에 메시지를 모니터링하는 후크 프로시저를 설치합니다. 자세한 내용은 CallWndProc 후크 프로시저 |
|
대상 창 프로시저에서 처리된 후 메시지를 모니터링하는 후크 프로시저를 설치합니다. 자세한 내용은 후크 프로시저를 |
|
CBT 애플리케이션에 유용한 알림을 수신하는 후크 프로시저를 설치합니다. 자세한 내용은 CBTProc 후크 프로시저를 참조하세요. |
|
다른 후크 프로시저를 디버깅하는 데 유용한 후크 프로시저를 설치합니다. 자세한 내용은 DebugProc 후크 프로시저를 참조하세요. |
|
애플리케이션의 포그라운드 스레드가 유휴 상태가 될 때 호출되는 후크 프로시저를 설치합니다. 이 후크는 유휴 시간 동안 낮은 우선 순위 작업을 수행하는 데 유용합니다. 자세한 내용은 ForegroundIdleProc 후크 프로시저를 참조하세요. |
|
메시지 큐에 게시된 메시지를 모니터링하는 후크 프로시저를 설치합니다. 자세한 내용은 GetMsgProc 후크 프로시저를 참조하세요. |
|
경고 저널링 후크 API는 Windows 11부터 지원되지 않으며 향후 릴리스에서 제거될 예정입니다. 따라서 대신 SendInput TextInput API를 호출하는 것이 좋습니다. WH_JOURNALRECORD 후크 프로시저에서 이전에 기록한 메시지를 게시하는 후크 프로시저를 설치합니다. 자세한 내용은 JournalPlaybackProc 후크 프로시저를 참조하세요. |
|
경고 저널링 후크 API는 Windows 11부터 지원되지 않으며 향후 릴리스에서 제거될 예정입니다. 따라서 대신 SendInput TextInput API를 호출하는 것이 좋습니다. 시스템 메시지 큐에 게시된 입력 메시지를 기록하는 후크 프로시저를 설치합니다. 이 후크는 매크로를 기록하는 데 유용합니다. 자세한 내용은 JournalRecordProc 후크 프로시저를 참조하세요. |
|
키 입력 메시지를 모니터링하는 후크 프로시저를 설치합니다. 자세한 내용은 KeyboardProc 후크 프로시저를 참조하세요. |
|
하위 수준 키보드 입력 이벤트를 모니터링하는 후크 프로시저를 설치합니다. 자세한 내용은 LowLevelKeyboardProc 후크 프로시저를 참조하세요. |
|
마우스 메시지를 모니터링하는 후크 프로시저를 설치합니다. 자세한 내용은 MouseProc 후크 프로시저를 참조하세요. |
|
하위 수준 마우스 입력 이벤트를 모니터링하는 후크 프로시저를 설치합니다. 자세한 내용은 LowLevelMouseProc 후크 프로시저를 참조하세요. |
|
대화 상자, 메시지 상자, 메뉴 또는 스크롤 막대에서 입력 이벤트의 결과로 생성된 메시지를 모니터링하는 후크 프로시저를 설치합니다. 자세한 내용은 MessageProc 후크 프로시저를 참조하세요. |
|
셸 애플리케이션에 유용한 알림을 수신하는 후크 프로시저를 설치합니다. 자세한 내용은 ShellProc 후크 프로시저를 참조하세요. |
|
대화 상자, 메시지 상자, 메뉴 또는 스크롤 막대에서 입력 이벤트의 결과로 생성된 메시지를 모니터링하는 후크 프로시저를 설치합니다. 후크 프로시저는 호출 스레드와 동일한 데스크톱의 모든 애플리케이션에 대해 이러한 메시지를 모니터링합니다. 자세한 내용은 SysMsgProc 후크 프로시저를 참조하세요. |
[in] lpfn
형식: HOOKPROC
후크 프로시저에 대한 포인터입니다. dwThreadId 매개 변수가 0이거나 다른 프로세스에서 만든 스레드의 식별자를 지정하는 경우 lpfn 매개 변수는 DLL의 후크 프로시저를 가리킵니다. 그렇지 않으면 lpfn 현재 프로세스와 연결된 코드의 후크 프로시저를 가리킬 수 있습니다.
[in] hmod
형식: HINSTANCE
lpfn 매개 변수가 가리키는 후크 프로시저가 포함된 DLL에 대한 핸들입니다.
[in] dwThreadId
형식: DWORD
후크 프로시저를 연결할 스레드의 식별자입니다. 데스크톱 앱의 경우 이 매개 변수가 0이면 후크 프로시저가 호출 스레드와 동일한 데스크톱에서 실행되는 모든 기존 스레드와 연결됩니다. Windows 스토어 앱의 경우 설명 섹션을 참조하세요.
반환 값
형식: HHOOK
함수가 성공하면 반환 값은 후크 프로시저에 대한 핸들입니다.
함수가 실패하면 반환 값은 NULL
발언
SetWindowsHookEx 사용하여 DLL을 다른 프로세스에 삽입할 수 있습니다. 32비트 DLL은 64비트 프로세스에 삽입할 수 없으며 64비트 DLL은 32비트 프로세스에 삽입할 수 없습니다. 애플리케이션이 다른 프로세스에서 후크를 사용해야 하는 경우 32비트 애플리케이션 호출 SetWindowsHookEx 32비트 DLL을 32비트 프로세스에 삽입하고, 64비트 애플리케이션 호출 SetWindowsHookEx 64비트 DLL을 64비트 프로세스에 삽입해야 합니다. 32비트 및 64비트 DLL의 이름은 달라야 합니다.
후크는 애플리케이션의 컨텍스트에서 실행되므로 애플리케이션의 "비트"에 일치해야 합니다. 32비트 애플리케이션이 64비트 Windows에 전역 후크를 설치하는 경우 32비트 후크가 각 32비트 프로세스에 삽입됩니다(일반적인 보안 경계가 적용됨). 64비트 프로세스에서 스레드는 여전히 "후크됨"으로 표시됩니다. 그러나 32비트 애플리케이션은 후크 코드를 실행해야 하므로 시스템은 후크 앱의 컨텍스트에서 후크를 실행합니다. 특히 SetWindowsHookEx를 호출한 스레드에서. 즉, 후킹 애플리케이션은 메시지를 계속 펌핑해야 하거나 64비트 프로세스의 정상적인 작동을 차단할 수 있습니다.
64비트 애플리케이션이 64비트 Windows에 전역 후크를 설치하는 경우 64비트 후크는 각 64비트 프로세스에 삽입되고 모든 32비트 프로세스는 후킹 애플리케이션에 대한 콜백을 사용합니다.
64비트 Windows 설치의 데스크톱에서 모든 애플리케이션을 후크하려면 각각 적절한 프로세스에서 32비트 전역 후크 및 64비트 글로벌 후크를 설치하고, 정상적인 작동을 차단하지 않도록 후킹 애플리케이션에서 메시지를 계속 펌핑해야 합니다. 이미 32비트 전역 후킹 애플리케이션이 있고 각 애플리케이션의 컨텍스트에서 실행할 필요가 없는 경우 64비트 버전을 만들 필요가 없습니다.
CallNextHookEx 함수 함수를 호출하여 다음 후크 프로시저에 연결하는 것은 선택 사항이지만 권장됩니다. 그렇지 않으면 후크를 설치한 다른 애플리케이션은 후크 알림을 받지 않으며 결과적으로 잘못 동작할 수 있습니다. 다른 애플리케이션에서 알림을 볼 수 없도록 반드시 방지해야 하는 경우가 아니면 CallNextHookEx 호출해야 합니다.
.NET 앱에서는 콜백이 가비지 수집기에서 이동되지 않도록 해야 합니다(그렇지 않으면 앱이 ExecutionEngineException과 충돌합니다). 이 작업을 수행하는 한 가지 방법은 콜백을 클래스의 정적 메서드로 만드는 것입니다.
종료하기 전에 애플리케이션은 UnhookWindowsHookEx 함수 함수를 호출하여 후크와 연결된 시스템 리소스를 해제해야 합니다.
후크의 범위는 후크 유형에 따라 달라집니다. 일부 후크는 전역 범위에서만 설정할 수 있습니다. 다음 표와 같이 특정 스레드에 대해서만 다른 스레드를 설정할 수도 있습니다.
갈고리 | 범위 |
---|---|
WH_CALLWNDPROC | 스레드 또는 전역 |
WH_CALLWNDPROCRET | 스레드 또는 전역 |
WH_CBT | 스레드 또는 전역 |
WH_DEBUG | 스레드 또는 전역 |
WH_FOREGROUNDIDLE | 스레드 또는 전역 |
WH_GETMESSAGE | 스레드 또는 전역 |
WH_JOURNALPLAYBACK | 전역 전용 |
WH_JOURNALRECORD | 전역 전용 |
WH_KEYBOARD | 스레드 또는 전역 |
WH_KEYBOARD_LL | 전역 전용 |
WH_MOUSE | 스레드 또는 전역 |
WH_MOUSE_LL | 전역 전용 |
WH_MSGFILTER | 스레드 또는 전역 |
WH_SHELL | 스레드 또는 전역 |
WH_SYSMSGFILTER | 전역 전용 |
지정된 후크 형식의 경우 스레드 후크가 먼저 호출된 다음 전역 후크가 호출됩니다. 후크를 처리하는 스레드가 아니라 후크를 설치한 스레드에서 WH_MOUSE, WH_KEYBOARD, WH_JOURNAL*, WH_SHELL 및 하위 수준 후크를 호출할 수 있습니다. 이러한 후크의 경우 32비트 후크가 후크 체인의 64비트 후크보다 앞서 있는 경우 32비트 후크와 64비트 후크가 모두 호출될 수 있습니다.
전역 후크는 공유 리소스이며, 이를 설치하면 호출 스레드와 동일한 데스크톱의 모든 애플리케이션에 영향을 줍니다. 모든 전역 후크 함수는 라이브러리에 있어야 합니다. 전역 후크는 특수 용도의 애플리케이션으로 제한되거나 애플리케이션 디버깅 중에 개발 지원으로 사용해야 합니다. 후크가 더 이상 필요하지 않은 라이브러리는 후크 프로시저를 제거해야 합니다.
windows 스토어 앱 : dwThreadId가 0이면 Windows 스토어 앱 프로세스 및 Windows 런타임 브로커 프로세스에 대해 창 후크 DLL이 UIAccess 프로세스(접근성 도구)에 의해 설치되지 않는 한 프로세스에서 로드되지 않습니다. 이러한 후크에 대한 알림은 설치 관리자의 스레드에서 전달됩니다.
- WH_JOURNALPLAYBACK
- WH_JOURNALRECORD
- WH_KEYBOARD
- WH_KEYBOARD_LL
- WH_MOUSE
- WH_MOUSE_LL
예제
예를 들어 후크 프로시저
메모
winuser.h 헤더는 SETWindowsHookEx를 유니코드 전처리기 상수의 정의에 따라 이 함수의 ANSI 또는 유니코드 버전을 자동으로 선택하는 별칭으로 정의합니다. 인코딩 중립 별칭을 인코딩 중립이 아닌 코드와 혼합하면 컴파일 또는 런타임 오류가 발생하는 불일치가 발생할 수 있습니다. 자세한 내용은 함수 프로토타입대한
요구 사항
요구 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 2000 Professional [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows 2000 Server [데스크톱 앱만 해당] |
대상 플랫폼 | Windows |
헤더 | winuser.h(Windows.h 포함) |
라이브러리 | User32.lib |
DLL | User32.dll |
API 집합 | ext-ms-win-ntuser-window-l1-1-0(Windows 8에서 도입) |
참고 항목
CallNextHookEx 함수
CallWindowProc 함수
CallWndProc
CallWndRetProc
foregroundIdleProc
GetMsgProc
KeyboardProc
LowLevelKeyboardProc
LowLevelMouseProc
messageProc
MouseProc
개념