You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB6实现全局热键:小键盘按键触发指定操作(支持桌面与游戏)

VB6 全局热键实现方案(小键盘触发数字3+鼠标左键点击)

核心实现思路

要实现跨应用(含桌面、游戏)的全局热键,必须借助Windows底层的低级键盘钩子(LowLevelKeyboardHook)——VB6自身的键盘事件仅对当前进程有效,无法覆盖全局场景。整体流程为:

  • 注册全局低级键盘钩子,拦截目标小键盘按键的按下事件
  • 拦截后阻止原按键消息传递,避免触发原键的默认行为
  • 模拟执行数字3的按下+释放,以及鼠标左键的点击动作
  • 程序退出时强制卸载钩子,防止内存泄漏

完整代码实现

1. 标准模块(modHotKey.bas)

存放API声明、钩子逻辑和输入模拟函数:

Option Explicit

' 键盘钩子常量
Public Const WH_KEYBOARD_LL = 13
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101

' 目标小键盘键码
Public Const VK_NUMPAD0 = &H60
Public Const VK_NUMPAD4 = &H64
Public Const VK_NUMPAD5 = &H65
Public Const VK_NUMPAD6 = &H66
Public Const VK_NUMPAD7 = &H67
Public Const VK_NUMPAD8 = &H68
Public Const VK_NUMPAD9 = &H69

' 输入模拟常量
Public Const KEYEVENTF_KEYUP = &H2
Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4

' Windows API 声明
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
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public 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 GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)

Public hKeyboardHook As Long

' 钩子回调函数:处理键盘事件
Public Function KeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim keyCode As Long
    
    If nCode >= 0 Then
        keyCode = (lParam And &HFF0000) \ &H10000
        
        ' 检测目标小键盘键的按下动作
        Select Case keyCode
            Case VK_NUMPAD0, VK_NUMPAD4, VK_NUMPAD5, VK_NUMPAD6, VK_NUMPAD7, VK_NUMPAD8, VK_NUMPAD9
                If wParam = WM_KEYDOWN Then
                    ' 阻止原按键消息传递到系统
                    KeyboardProc = 1
                    
                    ' 模拟数字3的按下+释放
                    keybd_event &H33, 0, 0, 0
                    keybd_event &H33, 0, KEYEVENTF_KEYUP, 0
                    
                    ' 模拟鼠标左键点击(按下+释放)
                    mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
                    mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
                    
                    Exit Function
                End If
        End Select
    End If
    
    ' 传递消息给下一个钩子(非目标键正常处理)
    KeyboardProc = CallNextHookEx(hKeyboardHook, nCode, wParam, lParam)
End Function

' 注册全局钩子
Public Sub RegisterHotKeyHook()
    Dim hModule As Long
    hModule = GetModuleHandle(vbNullString)
    hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf KeyboardProc, hModule, 0)
End Sub

' 卸载全局钩子
Public Sub UnregisterHotKeyHook()
    If hKeyboardHook <> 0 Then
        UnhookWindowsHookEx hKeyboardHook
        hKeyboardHook = 0
    End If
End Sub

2. 主窗体代码(frmMain.frm)

负责钩子的注册与卸载:

Option Explicit

Private Sub Form_Load()
    ' 程序启动时注册全局钩子
    RegisterHotKeyHook
End Sub

Private Sub Form_Unload(Cancel As Integer)
    ' 程序退出时强制卸载钩子,避免系统残留
    UnregisterHotKeyHook
End Sub

关键注意事项

  1. 权限要求:必须以管理员权限运行程序,否则Windows权限限制会导致钩子无法捕获全局事件。
  2. 游戏兼容性:部分使用DirectInput的游戏会绕过低级键盘钩子,若遇到这种情况,可尝试将程序设置为前台进程优先级,或改用DirectInput钩子(VB6实现难度较高)。
  3. 钩子卸载:务必在程序退出时调用UnhookWindowsHookEx,否则钩子会残留在系统中,可能导致键盘响应异常。
  4. 消息拦截逻辑:返回1是阻止原按键消息传递的关键,若保留原按键输入,可删除该返回语句。

内容的提问来源于stack exchange,提问作者reza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:52:58