다음을 통해 공유


SetWindowsHookExW 함수(winuser.h)

후크 체인에 애플리케이션 정의 후크 프로시저를 설치합니다. 후크 프로시저를 설치하여 특정 유형의 이벤트에 대한 시스템을 모니터링합니다. 이러한 이벤트는 특정 스레드 또는 호출 스레드와 동일한 데스크톱의 모든 스레드와 연결됩니다.

통사론

HHOOK SetWindowsHookExW(
  [in] int       idHook,
  [in] HOOKPROC  lpfn,
  [in] HINSTANCE hmod,
  [in] DWORD     dwThreadId
);

매개 변수

[in] idHook

형식: int

설치할 후크 프로시저의 유형입니다. 이 매개 변수는 다음 값 중 하나일 수 있습니다.

의미
WH_CALLWNDPROC
4

시스템에서 메시지를 대상 창 프로시저로 보내기 전에 메시지를 모니터링하는 후크 프로시저를 설치합니다. 자세한 내용은 CallWndProc 후크 프로시저 참조하세요.

WH_CALLWNDPROCRET
12

대상 창 프로시저에서 처리된 후 메시지를 모니터링하는 후크 프로시저를 설치합니다. 자세한 내용은 후크 프로시저를 HOOKPROC 콜백 함수를 참조하세요.

WH_CBT
5

CBT 애플리케이션에 유용한 알림을 수신하는 후크 프로시저를 설치합니다. 자세한 내용은 CBTProc 후크 프로시저를 참조하세요.

WH_DEBUG
9

다른 후크 프로시저를 디버깅하는 데 유용한 후크 프로시저를 설치합니다. 자세한 내용은 DebugProc 후크 프로시저를 참조하세요.

WH_FOREGROUNDIDLE
11

애플리케이션의 포그라운드 스레드가 유휴 상태가 될 때 호출되는 후크 프로시저를 설치합니다. 이 후크는 유휴 시간 동안 낮은 우선 순위 작업을 수행하는 데 유용합니다. 자세한 내용은 ForegroundIdleProc 후크 프로시저를 참조하세요.

WH_GETMESSAGE
3

메시지 큐에 게시된 메시지를 모니터링하는 후크 프로시저를 설치합니다. 자세한 내용은 GetMsgProc 후크 프로시저를 참조하세요.

WH_JOURNALPLAYBACK
1

경고

저널링 후크 API는 Windows 11부터 지원되지 않으며 향후 릴리스에서 제거될 예정입니다. 따라서 대신 SendInput TextInput API를 호출하는 것이 좋습니다.

WH_JOURNALRECORD 후크 프로시저에서 이전에 기록한 메시지를 게시하는 후크 프로시저를 설치합니다. 자세한 내용은 JournalPlaybackProc 후크 프로시저를 참조하세요.

WH_JOURNALRECORD
0

경고

저널링 후크 API는 Windows 11부터 지원되지 않으며 향후 릴리스에서 제거될 예정입니다. 따라서 대신 SendInput TextInput API를 호출하는 것이 좋습니다.

시스템 메시지 큐에 게시된 입력 메시지를 기록하는 후크 프로시저를 설치합니다. 이 후크는 매크로를 기록하는 데 유용합니다. 자세한 내용은 JournalRecordProc 후크 프로시저를 참조하세요.

WH_KEYBOARD
2

키 입력 메시지를 모니터링하는 후크 프로시저를 설치합니다. 자세한 내용은 KeyboardProc 후크 프로시저를 참조하세요.

WH_KEYBOARD_LL
13

하위 수준 키보드 입력 이벤트를 모니터링하는 후크 프로시저를 설치합니다. 자세한 내용은 LowLevelKeyboardProc 후크 프로시저를 참조하세요.

WH_MOUSE
7

마우스 메시지를 모니터링하는 후크 프로시저를 설치합니다. 자세한 내용은 MouseProc 후크 프로시저를 참조하세요.

WH_MOUSE_LL
14
하위 수준 마우스 입력 이벤트를 모니터링하는 후크 프로시저를 설치합니다. 자세한 내용은 LowLevelMouseProc 후크 프로시저를 참조하세요.
WH_MSGFILTER
-1

대화 상자, 메시지 상자, 메뉴 또는 스크롤 막대에서 입력 이벤트의 결과로 생성된 메시지를 모니터링하는 후크 프로시저를 설치합니다. 자세한 내용은 MessageProc 후크 프로시저를 참조하세요.

WH_SHELL
10

셸 애플리케이션에 유용한 알림을 수신하는 후크 프로시저를 설치합니다. 자세한 내용은 ShellProc 후크 프로시저를 참조하세요.

WH_SYSMSGFILTER
6
대화 상자, 메시지 상자, 메뉴 또는 스크롤 막대에서 입력 이벤트의 결과로 생성된 메시지를 모니터링하는 후크 프로시저를 설치합니다. 후크 프로시저는 호출 스레드와 동일한 데스크톱의 모든 애플리케이션에 대해 이러한 메시지를 모니터링합니다. 자세한 내용은 SysMsgProc 후크 프로시저를 참조하세요.

[in] lpfn

형식: HOOKPROC

후크 프로시저에 대한 포인터입니다. dwThreadId 매개 변수가 0이거나 다른 프로세스에서 만든 스레드의 식별자를 지정하는 경우 lpfn 매개 변수는 DLL의 후크 프로시저를 가리킵니다. 그렇지 않으면 lpfn 현재 프로세스와 연결된 코드의 후크 프로시저를 가리킬 수 있습니다.

[in] hmod

형식: HINSTANCE

lpfn 매개 변수가 가리키는 후크 프로시저가 포함된 DLL에 대한 핸들입니다. dwThreadId 매개 변수가 현재 프로세스에서 만든 스레드를 지정하고 후크 프로시저가 현재 프로세스와 연결된 코드 내에 있는 경우 hMod 매개 변수는 NULL 설정해야 합니다.

[in] dwThreadId

형식: DWORD

후크 프로시저를 연결할 스레드의 식별자입니다. 데스크톱 앱의 경우 이 매개 변수가 0이면 후크 프로시저가 호출 스레드와 동일한 데스크톱에서 실행되는 모든 기존 스레드와 연결됩니다. Windows 스토어 앱의 경우 설명 섹션을 참조하세요.

반환 값

형식: HHOOK

함수가 성공하면 반환 값은 후크 프로시저에 대한 핸들입니다.

함수가 실패하면 반환 값은 NULL. 확장 오류 정보를 얻으려면 GetLastError호출합니다.

발언

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비트 버전을 만들 필요가 없습니다.

hMod 매개 변수가 NULL dwThreadId 매개 변수가 0이거나 다른 프로세스에서 만든 스레드의 식별자를 지정하는 경우 오류가 발생할 수 있습니다.

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
이 동작은 후크 DLL과 대상 애플리케이션 프로세스 간에 아키텍처가 일치하지 않는 경우(예: 후크 DLL이 32비트이고 애플리케이션이 64비트를 처리하는 경우)와 유사합니다.

예제

예를 들어 후크 프로시저설치 및 해제를 참조하세요.

메모

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 함수

UnhookWindowsHookEx 함수

CBTProc

CallWndProc

CallWndRetProc

DebugProc

foregroundIdleProc

GetMsgProc

JournalPlaybackProc

JournalRecordProc

KeyboardProc

LowLevelKeyboardProc

LowLevelMouseProc

messageProc

MouseProc

ShellProc

SysMsgProc

개념

후크