Click here to Skip to main content
15,867,756 members
Articles / Programming Languages / VBScript

MCL Global Hotkey ActiveX control

Rate me:
Please Sign up or sign in to vote.
4.25/5 (4 votes)
12 May 2003CPOL1 min read 85.5K   1.2K   18   11
A system wide hotkey control written in VB6

Introduction

The attached source code is for a system-wide global hotkey control written in Visual Basic 6, originally posted on the Merrion Computing Downloads.

Registering a hotkey

There are two API calls concerned with registering a system wide hotkey: RegisterHotkey and UnregisterHotkey - the declarations are:

To register the hotkey, you need to specify hwnd - the window which will be notified when the hotkey combination is pressed, id - the unique identifier for the hotkey, fsModifiers - the modifiers of the hotkey (i.e. whether ALT, SHIFT, CTRL or WIN keys are pressed) and finally vKey - the virtual key code for the hot key. The modifiers which can be combined together are:

Listening Out for the hotkey

When a hotkey which has been registered successfully is pressed, the window specified in the hwnd is posted a WM_HOTKEY registered window message. Additionally the lParam parameter holds the modifier and virtual key code in its high and low words respectively.

Visual Basic does not handle the WM_HOTKEY message by default which means that you need to subclass the window hwnd in order to respond to it. To do this, you use the API call SetWindowLong with the index GWL_WNDPROC to replace the existing window procedure with yours.

Using the Control in your Application

To use this control in a Visual Basic application, compile the attached source code and then add an instance of the resulting OCX to your project. Add an instance of the MCLHotkey control to your form and press F4 to set the properties. Then add the code that you want executed when the hotkey is pressed to the HotkeyPressed event:

VB.NET
Private Sub MCLHotkey1_HotkeyPressed()
  Debug.Print "You pressed the hotkey at " & Now
End Sub
VB.NET
'\\ 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)
VB.NET
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
VB.NET
Public Enum enHotkeyModifiers
    MOD_ALT = &H1
    MOD_CONTROL = &H2
    MOD_SHIFT = &H4
    MOD_WIN = &H8
End Enum
VB.NET
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

History

  • 12th May, 2003: Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer
Ireland Ireland
C# / SQL Server developer
Microsoft MVP (Azure) 2017
Microsoft MVP (Visual Basic) 2006, 2007

Comments and Discussions

 
Generalmisbehave on window vista Pin
arunkumar.1658330-Jan-09 22:19
arunkumar.1658330-Jan-09 22:19 
Generalthis is great but Pin
Leerz5-Dec-06 6:16
Leerz5-Dec-06 6:16 
GeneralRe: this is great but Pin
Duncan Edwards Jones8-Feb-07 3:51
professionalDuncan Edwards Jones8-Feb-07 3:51 
GeneralExcellent Control but a couple of problems Pin
AvoSoftwareTeam29-Oct-05 2:38
AvoSoftwareTeam29-Oct-05 2:38 
GeneralRe: Excellent Control but a couple of problems Pin
Duncan Edwards Jones29-Oct-05 6:32
professionalDuncan Edwards Jones29-Oct-05 6:32 
GeneralDisable the [Ctrl]+[Esc] keys Pin
Anonymous13-Jan-05 11:46
Anonymous13-Jan-05 11:46 
GeneralGreat but... Pin
Q_HAL2-Aug-04 4:36
Q_HAL2-Aug-04 4:36 
Can I change the properties in runtime-mode?

I use MS-Access and the OCX works perfekt, but i don't know
how i can change the properties for the hotkeys in runtime.

Can you help me? please? Wink | ;)
GeneralNice Ariticle:reason why I rated this excellent Pin
Member 82620218-Jan-04 0:45
Member 82620218-Jan-04 0:45 
General.NET Version Pin
Duncan Edwards Jones13-Jun-03 0:45
professionalDuncan Edwards Jones13-Jun-03 0:45 
GeneralRe: .NET Version Pin
Jehosephat22-Nov-04 10:34
Jehosephat22-Nov-04 10:34 
GeneralRe: .NET Version Pin
Duncan Edwards Jones22-Nov-04 12:14
professionalDuncan Edwards Jones22-Nov-04 12:14 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.