Attribute VB_Name = "modHotkey"
Option Explicit

Public Const MOD_ALT = &H1
Public Const MOD_CONTROL = &H2
Public Const MOD_SHIFT = &H4
Public Const PM_REMOVE = &H1
Public Const WM_HOTKEY = &H312
Public Type POINTAPI
    X As Long
    Y As Long
End Type
Public Type Msg
    hwnd As Long
    Message As Long
    wParam As Long
    lParam As Long
    time As Long
    pt As POINTAPI
End Type
Public Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Public Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long
Public Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (lpMsg As Msg, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long
Public Declare Function WaitMessage Lib "user32" () As Long

Public blnCancel As Boolean

Public Sub SetupHotkey(FormToRegister As Form, ByVal CTRL As Boolean, ByVal ALT As Boolean, ByVal SHIFT As Boolean, Key As Long)
    ' YOU HAVE TO TYPE ME.SHOW AFTER YOU CALL THIS SUB!!!!
    Dim ret As Long
    Dim Combo As Long
    
    blnCancel = False ' Set the progs status to open
    ' Put together the CTRL+ALT+SHIFT Combo
    If CTRL = True Then
        If ALT = True Then
            If SHIFT = True Then
                Combo = MOD_CONTROL Or MOD_ALT Or MOD_SHIFT
            Else
                Combo = MOD_CONTROL Or MOD_ALT
            End If
        Else
            If SHIFT = True Then
                Combo = MOD_CONTROL Or MOD_SHIFT
            Else
                Combo = MOD_CONTROL
            End If
        End If
    ElseIf ALT = True Then
        If SHIFT = True Then
            Combo = MOD_ALT Or MOD_SHIFT
        Else
            Combo = MOD_ALT
        End If
    ElseIf SHIFT = True Then
        Combo = MOD_SHIFT
    End If
    'register the Ctrl-F hotkey
    ret = RegisterHotKey(FormToRegister.hwnd, &HBFFF&, Combo, Key)
    
    ' YOU HAVE TO TYPE ME.SHOW AFTER YOU CALL THIS SUB!!!
End Sub

Sub RemoveHotkey(RegisteredForm As Form)
    blnCancel = True
    'unregister hotkey
    Call UnregisterHotKey(RegisteredForm.hwnd, &HBFFF&)
End Sub


    ' COPY THIS JUNK INTO ONE OF THE FORMS THAT STAY OPEN
    '\/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/
    
'Public Sub ProcessMessages()
'    Dim Message As Msg
'    'loop until blnCancel is set to True
'    Do While Not blnCancel
'        'wait for a message
'        WaitMessage
'        'check if it's a HOTKEY-message
'        If PeekMessage(Message, Me.hwnd, WM_HOTKEY, WM_HOTKEY, PM_REMOVE) Then
'            '-------------------------------------------------
'            ' STUFF THAT HAPPENS WHEN THE HOTKEY IS PRESSED
'            '-------------------------------------------------
'        End If
'        'let the operating system process other events
'        DoEvents
'    Loop
'End Sub
