把下面代码放到标注模块里,通过里面的函数注册系统级的热键
Option Explicit
'这部分代码 放在标准模块里 也就是一般说的BAS模块
'为应用程序增加热键功能。结合子类技术,用自己定义的窗口消息处理函数,响应热键操作
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long
Declare Function GlobalAddAtom Lib "kernel32" Alias "GlobalAddAtomA" (ByVal lpString As String) As Integer
Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetTickCount Lib "kernel32" () As Long
Public Const WM_HOTKEY = &H312
Public Const MOD_ALT = &H1
Public Const MOD_CONTROL = &H2
Public Const MOD_SHIFT = &H4
Public Const GWL_WNDPROC = (-4)
Public Const SW_SHOW = 5
Public preWinProc As Long '保存窗口原来的消息处理函数地址
Public idHotKey As Long '保存热键的唯一性标识id
Public Modifiers As Long '保存辅助键组合信息 比如CTRL+A中的CTRL
Public uVirtKey As Long '保存虚拟键信息 比如CTRL+A中的A
Public strHotKey As String '热键的表达式
Public Function WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'自定义窗口消息处理函数,拦截窗口热键消息,执行自己定义的操作
If Msg = WM_HOTKEY Then '有热键消息
If wParam = idHotKey Then '核对唯一性标识
'ShowWindow hwnd, SW_SHOW '执行自定义操作(本例为显示本程序窗口)
SetWindowPos hwnd, HWND_TOP, 0, 0, 200, 200, SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
If blnTrayIcon Then RemoveFromTray: blnTrayIcon = False
If frmMain.WindowState = 1 Then frmMain.WindowState = 0
SetForegroundWindow hwnd
End If
End If
'如果不是热键信息则调用原来的消息处理程序
WindowProc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function
Public Function SetMyHotKey(ByVal hwnd As Long) As String
'设置热键并保证唯一性,基本规则是CTRL+ALT+(A~Z)。
'注册热键;修改窗口消息函数为自定义函数
'返回热键组合的文字描述,用于显示给用户看
preWinProc = GetWindowLong(hwnd, GWL_WNDPROC) '获得原来的窗口消息函数地址
SetWindowLong hwnd, GWL_WNDPROC, AddressOf WindowProc '用自定义函数代替原来的窗口消息函数
Modifiers = MOD_CONTROL + MOD_ALT
idHotKey = GlobalAddAtom(Format(GetTickCount)) '获得可用的ID号
For uVirtKey = vbKeyA To vbKeyZ '从A-Z找到一个可用的热键组合
If RegisterHotKey(hwnd, idHotKey, Modifiers, uVirtKey) Then Exit For
Next
SetMyHotKey = "CTRL + ALT + " + Chr(uVirtKey)
End Function
Public Function DelMyHotKey(ByVal hwnd As Long) As Long
'注销热键
UnregisterHotKey hwnd, idHotKey '注销热键
SetWindowLong hwnd, GWL_WNDPROC, preWinProc '恢复窗口默认的消息函数
End Function
钩子