MCL 全局热键 ActiveX 控件






4.25/5 (4投票s)
一个用 VB6 编写的系统范围的热键控件
引言
附件中的源代码是一个用 Visual Basic 6 编写的系统级全局热键控件,最初发布在 Merrion Computing Downloads。
注册热键
有两个 API 调用与注册系统级热键有关:RegisterHotkey
和 UnregisterHotkey
- 它们的声明如下:
要注册热键,您需要指定 hwnd
- 当按下热键组合时将接收通知的窗口,id
- 热键的唯一标识符,fsModifiers
- 热键的修饰符(即是否按下 ALT、SHIFT、CTRL 或 WIN 键),最后 vKey
- 热键的虚拟键码。可以组合在一起的修饰符是:
监听热键
当成功注册的热键被按下时,hwnd
中指定的窗口会收到一个 WM_HOTKEY
注册窗口消息。此外,lParam
参数分别在其低位和高位保存修饰符和虚拟键码。
Visual Basic 默认情况下不处理 WM_HOTKEY
消息,这意味着您需要对窗口 hwnd
进行子类化才能响应它。为此,您可以使用 API 调用 SetWindowLong
,并将索引设置为 GWL_WNDPROC
,以用您自己的窗口过程替换现有的窗口过程。
在您的应用程序中使用该控件
要在 Visual Basic 应用程序中使用此控件,请编译附件中的源代码,然后将结果 OCX 的一个实例添加到您的项目中。将 MCLHotkey
控件的一个实例添加到您的窗体,然后按 F4 设置属性。然后,将您希望在按下热键时执行的代码添加到 HotkeyPressed
事件中。
Private Sub MCLHotkey1_HotkeyPressed()
Debug.Print "You pressed the hotkey at " & Now
End Sub
'\\ API Calls used in subclassing windows....
Private 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
Private Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
'\\ Window specific information
Private Declare Function GetWindowLongApi Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLongApi Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_WNDPROC = (-4)
Public Function VB_WindowProc(ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Dim VKey As Long
Dim Modifier As Long
If wMsg = WM_HOTKEY Then
VKey = HiWord(lParam)
Modifier = LoWord(lParam)
'\\ Raise an event here to respond to the hotkey
End If
If sWindow.OldWndProc = 0 Then
VB_WindowProc = DefWindowProc(hwnd, wMsg, wParam, lParam)
Else
VB_WindowProc = CallWindowProc(sWindow.OldWndProc, hwnd, wMsg, wParam, lParam)
End If
End Function
Public Enum enHotkeyModifiers
MOD_ALT = &H1
MOD_CONTROL = &H2
MOD_SHIFT = &H4
MOD_WIN = &H8
End Enum
Private Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, _
ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Private Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, _
ByVal id As Long) As Long
历史
- 2003 年 5 月 12 日:初始发布