|
本帖最后由 Ineverleft 于 2021-1-8 17:10 编辑
以上代码可以屏蔽系统热键,只能屏蔽ctrl+esc,win,win+d,win+e等,希望可以帮到你!
- '模块代码:
- Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
- Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
- Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
- Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
- Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
- Private Const HC_ACTION = 0
- Private Const WM_KEYDOWN = &H100
- Private Const WM_KEYUP = &H101
- Private Const WM_SYSKEYDOWN = &H104
- Private Const WM_SYSKEYUP = &H105
- Private Const VK_TAB = &H9
- Private Const VK_CONTROL = &H11
- Private Const VK_ESCAPE = &H1B
- Public Const WH_KEYBOARD_LL = 13
- Private Const LLKHF_ALTDOWN = &H20
- Private Type KBDLLHOOKSTRUCT
- vkCode As Long
- scanCode As Long
- flags As Long
- time As Long
- dwExtraInfo As Long
- End Type
- Dim p As KBDLLHOOKSTRUCT
- Public Function LowLevelKeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
- Dim fEatKeystroke As Boolean
-
- If (nCode = HC_ACTION) Then
- If wParam = WM_KEYDOWN Or wParam = WM_SYSKEYDOWN Or wParam = WM_KEYUP Or wParam = WM_SYSKEYUP Then
- CopyMemory p, ByVal lParam, Len(p)
- fEatKeystroke = _
- ((p.vkCode = VK_TAB) And ((p.flags And LLKHF_ALTDOWN) <> 0)) Or _
- ((p.vkCode = VK_ESCAPE) And ((p.flags And LLKHF_ALTDOWN) <> 0)) Or _
- ((p.vkCode = VK_ESCAPE) And ((GetKeyState(VK_CONTROL) And &H8000) <> 0)) Or _
- ((p.vkCode = 91) Or (p.vkCode = 92) Or (p.vkCode = 93) Or (p.vkCode = 95) Or (p.vkCode = 255) Or (((p.flags And LLKHF_ALTDOWN) <> 0) And (p.vkCode = 115)))
- End If
- End If
-
- If fEatKeystroke Then
- LowLevelKeyboardProc = 1
- Else
- LowLevelKeyboardProc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
- End If
- End Function
- '窗体代码
- Private hhkLowLevelKybd As Long
- Private Sub Form_Load()
- hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, Addressof LowLevelKeyboardProc, App.hInstance, 0)
- End Sub
- Private Sub Form_Unload(Cancel As Integer)
- If hhkLowLevelKybd Then UnhookWindowsHookEx hhkLowLevelKybd
- End Sub
复制代码
|
|