65.9K
CodeProject 正在变化。 阅读更多。
Home

MCL 全局热键 ActiveX 控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.25/5 (4投票s)

2003年5月13日

CPOL

1分钟阅读

viewsIcon

87741

downloadIcon

1235

一个用 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 日:初始发布
© . All rights reserved.