다른 명령
키보드 후킹 예제
AutoIt에서 SetWindowsHookEx를 이용해 키보드 입력을 가로채고, 특정 키를 F13~F20으로 매핑하는 예제
⸻
✅ 목표
예: CapsLock 키를 누르면 F13(가상 키 코드 0x7C)을 대신 보내도록 시스템 레벨에서 처리합니다. 이 코드는 모든 창에서 작동하며, 일반적인 HotKeySet()보다 안정적입니다.
⸻
✅ 준비 사항 • 반드시 AutoIt을 관리자 권한으로 실행하세요. • WinAPIEx.au3 또는 유사한 API 확장 라이브러리가 필요합니다.
⸻
✅ 코드 예제 (SetWindowsHookEx 기반 키보드 후킹)
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
Global $hHook, $hMod
; DLL 콜백 등록
Global $pFunc = DllCallbackRegister("_LowLevelKeyboardProc", "long", "int;wparam;lparam")
; 현재 모듈 핸들
$hMod = _WinAPI_GetModuleHandle(0)
; 후킹 시작 (WH_KEYBOARD_LL = 13)
$hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($pFunc), $hMod, 0)
If @error Or $hHook = 0 Then
MsgBox(16, "Error", "Hook 설치 실패!")
Exit
EndIf
; 메시지 루프 유지
While True
Sleep(100)
WEnd
; 프로그램 종료 시 후킹 해제
DllCallbackFree($pFunc)
_WinAPI_UnhookWindowsHookEx($hHook)
; 후킹 함수 정의
Func _LowLevelKeyboardProc($nCode, $wParam, $lParam)
If $nCode < 0 Then
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndIf
Local $tKBDLLHOOKSTRUCT = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
Local $vkCode = DllStructGetData($tKBDLLHOOKSTRUCT, "vkCode")
; 눌림 이벤트만 처리
If $wParam = $WM_KEYDOWN Or $wParam = $WM_SYSKEYDOWN Then
; CapsLock(0x14) 키를 F13(0x7C)로 대체
If $vkCode = 0x14 Then
_SendVirtualKey(0x7C) ; F13
Return 1 ; 원래 키는 무시
EndIf
EndIf
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc
Func _SendVirtualKey($vk)
_WinAPI_Keybd_Event($vk, 0, 0, 0) ; key down
_WinAPI_Keybd_Event($vk, 0, $KEYEVENTF_KEYUP, 0) ; key up
EndFunc
⸻
✅ 확장 예시 • 다른 키도 다음처럼 바꿀 수 있습니다:
If $vkCode = 0x2D Then ; Insert
_SendVirtualKey(0x7D) ; F14
Return 1
EndIf
If $vkCode = 0x91 Then ; ScrollLock
_SendVirtualKey(0x7E) ; F15
Return 1
EndIf
⸻
✅ 참고자료
키 이름 가상 키 코드 (Hex) 설명 F13 ~ F20 0x7C ~ 0x83 확장 펑션키 CapsLock 0x14 일반 키 Insert 0x2D 일반 키 Scroll Lock 0x91 일반 키
⸻
⚠️ 주의사항 • 후킹은 시스템 자원을 사용하는 민감한 작업입니다. • 잘못 구현 시 전체 시스템이 느려질 수 있습니다. • 키를 너무 많이 리매핑하면 충돌이 생길 수 있으므로 필요한 키만 설정하세요.
⸻
이제 이 코드를 통해 CapsLock → F13, Insert → F14 등 시스템 전역에서 완벽한 매핑이 가능합니다.