현기증이 날 수도 있지만 VB 지식을 알고 있고 이것을 원한다면 주의 깊게 공부해야 합니다.
modHook.bas
옵션 명시적
공개 선언 함수 CallNextHookEx Lib user32.dll(ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lparam As Long)
Public Declare Sub CopyMemory Lib kernel32 Alias RtlMoveMemory (lpDest As Any, lpSource As Any, ByVal cBytes As Long)
공개 선언 하위 키bd_event Lib user32(ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
공개 데이터()를 문자열로
공개 NUM
오랫동안 공개 OldHook
공개 LngClsPtr 길이
공용 함수 BackHook(ByVal nCode는 길게, ByVal wParam은 길게, ByVal lparam은 길게)
nCode < 0이면
BackHook = CallNextHookEx(OldHook, nCode, wParam, lparam)
종료 기능
종료 조건
ResolvePointer(LngClsPtr).RiseEvent(lparam)
CallNextHookEx(OldHook, nCode, wParam, lparam) 호출
기능 종료
개인 함수 ResolvePointer(ByVal lpObj As Long) As ClsHook
ClsHook로 희미한 oSH
CopyMemory oSH, lpObj, 4&
ResolvePointer = oSH 설정
CopyMemory oSH, 0&, 4&
기능 종료
ClsHook.cls
옵션 명시적
공개 이벤트 KeyDown(정수형 KeyCode, 정수형 Shift)
비공개 유형 EVENTMSG
wMsg는 길게
lParamLow만큼 오랫동안
lParamHigh만큼 높음
msg시간은 길다
hWndMsg를 길게
끝 유형
비공개 상수 WH_JOURNALRECORD = 0
개인 상수 WM_KEYDOWN = &H100
Private 선언 함수 SetWindowsHookEx Lib user32.dll 별칭 SetWindowsHookExA (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long)
비공개 선언 기능 UnhookWindowsHookEx Lib user32.dll(ByVal hHook As Long)
개인 선언 함수 GetAsyncKeyState Lib user32.dll(ByVal vKey As Long)을 정수로 사용
공개 하위 SetHook()
OldHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf BackHook, App.hInstance, 0)
서브 끝
공개 서브 UnHook()
UnhookWindowsHookEx(OldHook) 호출
서브 끝
친구 함수 RiseEvent(ByVal lparam As Long)
EVENTMSG로 희미한 메시지 보내기
Dim IntShift를 정수로 사용
Dim IntCode를 정수로 사용
CopyMemory 메시지, ByVal lparam, Len(Msg)
IntShift = 0
사례 선택 Msg.wMsg
케이스 WM_KEYDOWN
GetAsyncKeyState(vbKeyShift)이면 IntShift = (IntShift Or 1)
GetAsyncKeyState(vbKeyControl)이면 IntShift = (IntShift Or 2)
GetAsyncKeyState(vbKeyMenu)이면 IntShift = (IntShift Or 4)
IntCode = Msg.lParamLow 및 &HFF
디버그.인쇄 Msg.lParamLow
디버그.인쇄(&HFF)
raiseEvent KeyDown(IntCode, IntShift)
선택 종료
기능 종료
비공개 하위 클래스_Initialize()
LngClsPtr = ObjPtr(나)
서브 끝
form1.frm
옵션 명시적
Dim WithEvents 후크를 ClsHook로 사용
비공개 선언 함수 MapVirtualKeyEx Lib user32 별칭 MapVirtualKeyExA (ByVal uCode As Long, ByVal uMapType As Long, ByVal dwhkl As Long)
비공개 선언 함수 GetKeyboardLayout Lib user32(ByVal dwLayout As Long)
개인 선언 함수 GetForegroundWindow Lib user32 () As Long
개인 선언 함수 GetWindowThreadProcessId Lib user32 (ByVal hwnd As Long, lpdwProcessId As Long)
개인 하위 Hook_KeyDown(정수로 KeyCode, 정수로 Shift)
희미한 StrCode를 문자열로
StrCode = CodeToString(키코드)
StrCode = [Shift] 또는 StrCode = [Alt] 또는 StrCode = [Ctrl]인 경우
Shift = vbAltMask + vbCtrlMask이면 StrCode = [Alt + Ctrl]
Shift = vbAltMask + vbShiftMask이면 StrCode = [Alt + Shift]
Shift = vbCtrlMask + vbShiftMask이면 StrCode = [Ctrl + Shift]
Shift = vbCtrlMask + vbShiftMask + vbAltMask인 경우 StrCode = [Ctrl + Shift +Alt]
또 다른
Shift = vbShiftMask이면 StrCode = [Shift] + & StrCode
Shift = vbCtrlMask이면 StrCode = [Ctrl] + & StrCode
Shift = vbAltMask이면 StrCode = [Alt] + & StrCode
Shift = vbAltMask + vbCtrlMask이면 StrCode = [Alt + Ctrl] + & StrCode
Shift = vbAltMask + vbShiftMask이면 StrCode = [Alt + Shift] + & StrCode
Shift = vbCtrlMask + vbShiftMask이면 StrCode = [Ctrl + Shift] + & StrCode
Shift = vbCtrlMask + vbShiftMask + vbAltMask인 경우 StrCode = [Ctrl + Shift +Alt] + & StrCode
종료 조건
If LCase(StrCode) = LCase(HotKey) Then ' 이 부분은 from 창을 숨기고 표시하는 키보드 HOOK 이후의 간단한 기능입니다.
App.TaskVisible = False인 경우
미쇼
App.TaskVisible = 참
또 다른
나.숨기기
App.TaskVisible = 거짓
종료 조건
종료 조건
서브 끝
개인 함수 CodeToString(nCode As Integer) As String
Dim StrKey를 문자열로
Case nCode 선택
사례 vbKeyBack: StrKey = BackSpace
사례 vbKeyTab: StrKey = 탭
사례 vbKeyClear: StrKey = 지우기
사례 vbKeyReturn: StrKey = Enter
사례 vbKeyShift: StrKey = Shift
사례 vbKeyControl: StrKey = Ctrl
사례 vbKeyMenu: StrKey = Alt
사례 vbKeyPause: StrKey = 일시 중지
사례 vbKeyCapital: StrKey = CapsLock
사례 vbKeyEscape: StrKey = ESC
사례 vbKeySpace: StrKey = 스페이스바
사례 vbKeyPageUp: StrKey = PAGE UP
사례 vbKeyPageDown: StrKey = 페이지 다운
사례 vbKeyEnd: StrKey = END
사례 vbKeyHome: StrKey = HOME
사례 vbKeyLeft: StrKey = 왼쪽 화살표
사례 vbKeyUp: StrKey = 위쪽 화살표
사례 vbKeyRight: StrKey = 오른쪽 화살표
사례 vbKeyDown: StrKey = 아래쪽 화살표
사례 vbKeySelect: StrKey = SELECT
사례 vbKeyPrint: StrKey = 인쇄 화면
사례 vbKeyExecute: StrKey = EXECUTE
사례 vbKeySnapshot: StrKey = SNAPSHOT
사례 vbKeyInsert: StrKey = INS
사례 vbKeyDelete: StrKey = DEL
사례 vbKeyHelp: StrKey = 도움말
사례 vbKeyNumlock: StrKey = NUM LOCK
사례 vbKey0을 vbKey9로: StrKey = Chr$(nCode)
사례 vbKeyA를 vbKeyZ로: StrKey = LCase(Chr$(nCode)) 'MapVirtualKeyEx(nCode, 2, GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, 0))))
사례 vbKeyF1에서 vbKeyF16으로: StrKey = F & CStr(nCode - 111)
사례 vbKeyNumpad0을 vbKeyNumpad9로: StrKey = Numpad & CStr(nCode - 96)
사례 vbKeyMultiply: StrKey = Numpad {*}
Case vbKeyAdd: StrKey = Numpad {+}
Case vbKeySeparator: StrKey = Numpad {ENTER}
사례 vbKeySubtract: StrKey = Numpad {-}
사례 vbKeyDecimal: StrKey = Numpad {.}
사례 vbKeyDivide: StrKey = Numpad {/}
그렇지 않은 경우
StrKey = Chr$(MapVirtualKeyEx(nCode, 2, GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, 0)))) & Str(MapVirtualKeyEx(nCode, 2, GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, 0))))
선택 종료
CodeToString = [ & StrKey & ]
기능 종료