`

VB 用WH_KEYBOARD_LL实现全局热键的例子

    博客分类:
  • vb
VB 
阅读更多
Option Explicit
Private Declare Function SetWindowsHookEx _
Lib "user32" _
Alias "SetWindowsHookExW" (ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long
Private Declare Function
UnhookWindowsHookEx _
Lib "user32" (ByVal hHook 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
Private Declare Sub
CopyMemory _
Lib "kernel32" _
Alias "RtlMoveMemory" (ByVal Destination As Long, _
ByVal Source As Long, _
ByVal Length As Long)

Private Type KBDLLHOOKSTRUCT
VKCode
As Long
scanCode As Long
flags As Long
time As Long
dwExtraInfo As Long
End
Type

Private Const VK_LSHIFT = &HA0
Private Const VK_RSHIFT = &HA1
Private Const VK_LCONTROL = &HA2
Private Const VK_RCONTROL = &HA3
Private Const VK_LMENU = &HA4 'MENU=ALT
Private Const VK_RMENU = &HA5
Private Const HC_ACTION = &H0
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101

Dim hHook As Long

Dim
CtrlIsPressed As Boolean
Dim
ShiftIsPressed As Boolean
Dim
AltIsPressed As Boolean

Public
Type HotKeyInfo
IncludeCtrl
As Boolean
IncludeShift As Boolean
IncludeAlt As Boolean
UserKey As String * 1
End Type

Private Type UsrHotKeyInfo
UserInfo
As HotKeyInfo
IsInUse
As Boolean
End
Type

Dim savedHotKeys() As UsrHotKeyInfo

Public Sub HotKey_Process(ByVal KeyVKCode As Long, ByVal nAction As Long)
If ((KeyVKCode = VK_LCONTROL) Or (KeyVKCode = VK_RCONTROL)) Then
CtrlIsPressed = (nAction = WM_KEYDOWN)
GoTo SubProc_Exit
End If
If
((KeyVKCode = VK_LSHIFT) Or (KeyVKCode = VK_RSHIFT)) Then
ShiftIsPressed = (nAction = WM_KEYDOWN)
GoTo SubProc_Exit
End If
If
((KeyVKCode = VK_LMENU) Or (KeyVKCode = VK_RMENU)) Then
AltIsPressed = (nAction = WM_KEYDOWN)
GoTo SubProc_Exit
End If
If
(nAction = WM_KEYUP) Then Call HotKeyProc(PressedHotKeyIndex(KeyVKCode))
'CtrlIsPressed = False: ShiftIsPressed = False: AltIsPressed = False
SubProc_Exit:

End Sub

'ret val=index of hotkey
Public Function AddHotKey(ByRef addKeyInfo As HotKeyInfo) As Integer
Dim
newInd As Integer
Dim
I As Integer
Dim
bFound As Boolean: bFound = False
For
I = LBound(savedHotKeys) To UBound(savedHotKeys)
If (savedHotKeys(I).IsInUse = False) Then
newInd = I: bFound = True
Exit For
End If
Next
If
(Not bFound) Then
newInd = UBound(savedHotKeys) + 1
ReDim Preserve savedHotKeys(newInd)
End If
With
savedHotKeys(newInd)
.UserInfo = addKeyInfo
.UserInfo.UserKey = UCase(.UserInfo.UserKey)
.IsInUse =
True
End With
End Function

Public Sub
ClearHotKeyList()
Erase savedHotKeys
ReDim savedHotKeys(0)
End Sub

Public Sub
DelHotKey(ByVal nIndex As Integer)
savedHotKeys(nIndex).IsInUse =
False
End Sub

Private Function
PressedHotKeyIndex(ByVal VKCode As Long) As Integer
PressedHotKeyIndex = -1
Dim newInd As Integer
Dim
I As Integer
Dim
bFound As Boolean: bFound = False
Dim
strPressedKey As String: strPressedKey = UCase(Chr(VKCode))
For I = LBound(savedHotKeys) To UBound(savedHotKeys)
With savedHotKeys(I)

If (.IsInUse = True) Then
If
((.UserInfo.IncludeAlt = AltIsPressed) And _
(.UserInfo.IncludeCtrl = CtrlIsPressed)
And _
(.UserInfo.IncludeShift = ShiftIsPressed)
And _
(.UserInfo.UserKey = strPressedKey)) _
Then
PressedHotKeyIndex = I: GoTo Func_Exit
End If
End If

End With
Next

Func_Exit:

End Function

Private Sub
HotKeyProc(ByVal nIndex As Integer)

If (nIndex > -1) Then

With
frmFunctionSelect

Select Case nIndex

Case 0 'HotKey 0 Pressed
'what can i do for u?
End Select

End With

End If

End Sub

Public Function
DisableKbdHook() As Boolean
'Debug.Print "hHook: "; hHook
hHook = UnhookWindowsHookEx(hHook) - 1
DisableKbdHook = (hHook = 0)
End Function

Public Function
EnableKbdHook() As Boolean
'Debug.Print "hHook: "; hHook
If (hHook <= 0) Then hHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0)
EnableKbdHook = (hHook <>
0)
End Function

Private Function
LowLevelKeyboardProc(ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

If
(nCode <> HC_ACTION) Then
LowLevelKeyboardProc = CallNextHookEx(hHook, nCode, wParam, lParam)
Exit Function
End If

Call
HotKey_Process(GetKeyVKCode(lParam), wParam)

LowLevelKeyboardProc = CallNextHookEx(hHook, nCode, wParam, lParam):
GoTo Exit_Func
Exit_Func:
End Function

Private Function
GetKeyVKCode(ByVal memAddr As Long) As Long
Dim
curHs As KBDLLHOOKSTRUCT
Call CopyMemory(VarPtr(curHs), ByVal memAddr, Len(curHs))
GetKeyVKCode = curHs.VKCode
End Function

Private Function
GetKeyScanCode(ByVal memAddr As Long) As Long
Dim
curHs As KBDLLHOOKSTRUCT
Call CopyMemory(VarPtr(curHs), ByVal memAddr, Len(curHs))
GetKeyScanCode = curHs.scanCode
End Function

 

分享到:
评论

相关推荐

    WH_KEYBOARD_LL.rar_WH_KEYBOARD VB_WH_KEYBOARD_LL_vb WH_KEYBOARD

    标签中的“wh_keyboard_vb”、“wh_keyboard_ll”、“vb__wh_keyboard_ll”和“屏蔽_热键”都与VB(Visual Basic)语言和`WH_KEYBOARD_LL`钩子的使用有关,表明这是一个使用VB来实现的键盘事件处理示例。 在压缩包...

    VB精简全局按键代码

    在VB(Visual Basic)编程环境中,全局按键代码的实现是一个常用的功能,它允许开发者创建一个程序,该程序可以在任何活动的应用程序中响应特定的按键事件,实现自动化操作或快捷键功能。这种技术对于提高工作效率、...

    VB.NET HOOK

    设置热键通常需要定义一个WH_KEYBOARD_LL类型的全局键盘钩子,注册一个键盘事件处理函数,并在该函数内检查按键消息,判断是否为预设的热键组合。 全局钩子的实现需要注意几个关键点: 1. **线程安全**:由于钩子...

    [VB]局部钩子演示

    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf KeyboardHookProc, Me.ModuleHandle, 0) ' 卸载钩子 UnhookWindowsHookEx(hHook) ``` 需要注意的是,由于VB6不支持低级(Low-Level)钩子,如键盘和鼠标钩子...

    vb真正的全屏幕取词

    1. **钩子技术**:VB中实现全屏取词需要设置系统级别的钩子,例如WH_KEYBOARD_LL(低级键盘钩子)和WH_MOUSE_LL(低级鼠标钩子),来捕获全局的键盘和鼠标事件,以便在用户点击时获取屏幕上的文本。 2. **屏幕截图*...

    .net实现网吧锁屏源码--屏蔽系统热键

    标题中的".net实现网吧锁屏源码--屏蔽系统热键"指的是使用.NET框架开发的一款特殊软件,该软件的主要功能是在网吧环境下锁定计算机屏幕,并阻止用户通过系统热键(如Alt+Tab、Ctrl+Esc等)切换窗口或退出锁定状态。...

    HOOK学习指南

    例如,通过安装WH_KEYBOARD_LL类型的全局HOOK,可以实时获取到键盘的按键事件,用于实现热键设置或其他键盘相关的功能。 总结,HOOK是Windows编程中的重要工具,它允许开发者深入参与到系统事件的处理中,从而实现...

    VB实现DEL+CTRL+ALT屏蔽SysHotKey

    这个函数需要传递参数,包括钩子类型(WH_KEYBOARD_LL表示低级键盘钩子),钩子处理函数的地址,以及一个线程ID等。钩子处理函数会在每次键盘事件发生时被调用,这时我们可以在函数内部判断是否需要屏蔽DEL+CTRL+ALT...

Global site tag (gtag.js) - Google Analytics