อาจทำให้คุณเวียนหัว แต่ตราบใดที่คุณมีความรู้เกี่ยวกับ VB และต้องการสิ่งนี้ คุณต้องศึกษามันอย่างรอบคอบ
modHook.bas
ตัวเลือกที่ชัดเจน
ฟังก์ชั่นประกาศสาธารณะ CallNextHookEx Lib user32.dll (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lparam As Any) ตราบใดที่
ประกาศสาธารณะ Sub CopyMemory Lib kernel32 Alias RtlMoveMemory (lpDest As Any, lpSource As Any, ByVal cBytes As Long)
ประกาศสาธารณะย่อย keybd_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 ตราบเท่าที่) เป็น ClsHook
หรี่ oSH เป็น ClsHook
คัดลอกหน่วยความจำ oSH, lpObj, 4&
ตั้งค่า ResolvePointer = oSH
คัดลอกหน่วยความจำ oSH, 0&, 4&
ฟังก์ชันสิ้นสุด
ClsHook.cls
ตัวเลือกที่ชัดเจน
กิจกรรมสาธารณะ KeyDown (KeyCode เป็นจำนวนเต็ม, Shift เป็นจำนวนเต็ม)
ประเภทส่วนตัว EVENTMSG
ข้อความตราบเท่าที่
lพารามิเตอร์ต่ำตราบเท่าที่
lพารามิเตอร์สูงตราบเท่าที่
msgเวลานานที่สุด
hWndMsg ตราบเท่าที่
ประเภทสิ้นสุด
Const ส่วนตัว WH_JOURNALRECORD = 0
ส่วนตัว Const WM_KEYDOWN = &H100
ฟังก์ชั่นการประกาศส่วนตัว SetWindowsHookEx Lib user32.dll นามแฝง SetWindowsHookExA (ByVal idHook ตราบใดที่ ByVal lpfn ตราบใดที่ ByVal hmod ตราบใดที่ ByVal dwThreadId ตราบใดที่) ตราบใดที่
ฟังก์ชั่นประกาศส่วนตัว 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 ตราบเท่าที่) ตราบใดที่
Dim Msg เป็น EVENTMSG
Dim IntShift เป็นจำนวนเต็ม
Dim IntCode เป็นจำนวนเต็ม
CopyMemory ข่าวสารเกี่ยวกับ ByVal lparam, Len (ข่าวสารเกี่ยวกับ)
อินต์ชิฟต์ = 0
เลือกกรณีและปัญหา Msg.wMsg
กรณี WM_KEYDOWN
ถ้า GetAsyncKeyState(vbKeyShift) ดังนั้น IntShift = (IntShift หรือ 1)
ถ้า GetAsyncKeyState(vbKeyControl) ดังนั้น IntShift = (IntShift หรือ 2)
ถ้า GetAsyncKeyState (vbKeyMenu) ดังนั้น IntShift = (IntShift หรือ 4)
IntCode = Msg.lParamLow และ &HFF
Debug.พิมพ์ Msg.lParamLow
ตรวจแก้จุดบกพร่องพิมพ์ &HFF
RaiseEvent KeyDown (IntCode, IntShift)
สิ้นสุดการเลือก
ฟังก์ชันสิ้นสุด
Class_Initialize ส่วนตัว ()
LngClsPtr = ObjPtr(ฉัน)
จบหมวดย่อย
form1.frm
ตัวเลือกที่ชัดเจน
Dim WithEvents Hook เป็น ClsHook
ฟังก์ชั่นการประกาศส่วนตัว MapVirtualKeyEx Lib user32 นามแฝง MapVirtualKeyExA (ByVal uCode ตราบใดที่ ByVal uMapType ตราบใดที่ ByVal dwhkl ตราบใดที่) ตราบใดที่
ฟังก์ชั่นการประกาศส่วนตัว GetKeyboardLayout Lib user32 (ByVal dwLayout As Long) ตราบใดที่
ฟังก์ชั่นประกาศส่วนตัว GetForegroundWindow Lib user32 () ตราบใดที่
ฟังก์ชันการประกาศส่วนตัว GetWindowThreadProcessId Lib user32 (ByVal hwnd As Long, lpdwProcessId As Long) ตราบใดที่
Hook_KeyDown ย่อยส่วนตัว (KeyCode เป็นจำนวนเต็ม, Shift เป็นจำนวนเต็ม)
DimStrCodeAsString
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
สิ้นสุดถ้า
ถ้า LCase(StrCode) = LCase(HotKey) ดังนั้น ' ส่วนนี้เป็นฟังก์ชันง่ายๆ หลังคีย์บอร์ด HOOK ซึ่งจะซ่อนและแสดงหน้าต่างจาก
ถ้า App.TaskVisible = False แล้ว
ฉัน.แสดง
App.TaskVisible = จริง
อื่น
ฉันซ่อน
App.TaskVisible = เท็จ
สิ้นสุดถ้า
สิ้นสุดถ้า
จบหมวดย่อย
ฟังก์ชั่นส่วนตัว CodeToString (nCode As Integer) เป็นสตริง
DimStrKeyAsString
เลือก กรณี 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 = SPACEBAR
กรณี 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 = ดำเนินการ
กรณี 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 {*}
กรณี vbKeyAdd: StrKey = Numpad {+}
กรณี vbKeySeparator: StrKey = Numpad {ENTER}
กรณี vbKeySubtract: StrKey = Numpad {-}
กรณี vbKeyDecimal: StrKey = Numpad {.}
กรณี vbKeyDivide: StrKey = แป้นตัวเลข {/}
กรณีอื่น
StrKey = Chr$(MapVirtualKeyEx(nCode, 2, GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, 0)))) & Str(MapVirtualKeyEx(nCode, 2, GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, 0))))
สิ้นสุดการเลือก
CodeToString = [ & StrKey & ]
ฟังก์ชันสิ้นสุด