Описание функции


WM_HOTKEY

Сообщение выполняется при использовании зарегистрированных горячих клавиш для текущего процесса.

Параметры

Указанные параметры передаются системой.
$wParam Идентификатор, на который зарегистрирована горячая клавиша, целое число от 1001 и более
$lParam Двойное слово содержит модификатор и виртуальную клавишу:
    младшее слово - модификатор, который может быть комбинацией следующих значений
        MOD_ALT - клавиша Alt
        MOD_CONTROL - клавиша Ctrl
        MOD_SHIFT - клавиша Shift
        MOD_WIN - клавиша Windows
    старшее слово - виртуальная клавиша

Примечания

Смотрите функцию SetWindowCallback.

Пример

; AZJIO
; http://purebasic.info/phpBB3ex/viewtopic.php?f=5&t=5521

EnableExplicit

#GadgetHK = 0
#GadgetBtn = 1
#HK_ID = 1001

Define HotkeyCode
Define VirtKey
Define ModKey

; Macro MAKELONG(loword, hiword)
; (hiword << 16 | loword)
; EndMacro

Procedure.s TrimLeft(*a, n)
    Protected *p.string = @*a
    *p\s = Right(*p\s, Len(*p\s) - n)
EndProcedure

Procedure.s GetKey(HotkeyCode)
    Protected HiW, Key.s
    HiW = HotkeyCode >> 16
    If HiW & #HOTKEYF_CONTROL
        Key + " + Ctrl"
    EndIf
    If HiW & #HOTKEYF_SHIFT
        Key + " + Shift"
    EndIf
    If HiW & #HOTKEYF_ALT
        Key + " + Alt"
    EndIf
    Key + " + " + Chr(HotkeyCode & $FFFF)
    TrimLeft(@Key, 3)
    ProcedureReturn Key
EndProcedure

Procedure GetModKey(MOD)
    Protected ModKey = 0
    If MOD & #HOTKEYF_SHIFT
        ModKey | #MOD_SHIFT
    EndIf
    If MOD & #HOTKEYF_CONTROL
        ModKey | #MOD_CONTROL
    EndIf
    If MOD & #HOTKEYF_ALT
        ModKey | #MOD_ALT
    EndIf
    ProcedureReturn ModKey
EndProcedure


If OpenWindow(0, 0, 0, 240, 70, "Гаджет Горячие Клавиши", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ShortcutGadget(#GadgetHK, 10, 10, 200, 25, #PB_Shortcut_Control | #PB_Shortcut_A)
    ;     SetGadgetState(0 , #PB_Shortcut_Control | #PB_Shortcut_B) ; можно так вставить
    ButtonGadget(#GadgetBtn, 10, 40, 100, 28, "Применить")
    Repeat
        Select WaitWindowEvent()
            Case #WM_HOTKEY
                Select EventwParam()
                    Case #HK_ID
                        Debug "Перехвачена горяцая клавиша 1"
                    Case 2
                        Debug "Перехвачена горяцая клавиша 2"
                    Case 3
                        Debug "Перехвачена горяцая клавиша 3"
                EndSelect
            Case #PB_Event_Gadget
                Select EventGadget()
                    Case #GadgetBtn
                        HotkeyCode = GetGadgetState(#GadgetHK)
                        If Not HotkeyCode
                            Debug "Отмена горячей клавиши (Backspace)"
                            UnregisterHotKey_(WindowID(0), #HK_ID)
                        EndIf
                        VirtKey = HotkeyCode & $FFFF ; LoWord
                        ModKey = GetModKey(HotkeyCode >> 16)
                        Debug GetKey(HotkeyCode)
                        ; Debug SendMessage_(GadgetID(#GadgetHK), #HKM_GETHOTKEY, 0, 0)
                        ; If MAKELONG(loword, hiword)
                        UnregisterHotKey_(WindowID(0), #HK_ID) ; переназначение работает без отмены регистрации
                        If Not RegisterHotKey_(WindowID(0), #HK_ID, ModKey, VirtKey)
                            Debug "Не удалось зарегистрироваль горячую клавишу"
                        EndIf
                EndSelect
            Case #PB_Event_CloseWindow
                UnregisterHotKey_(WindowID(0), #HK_ID)
                CloseWindow(0)
                End
        EndSelect
    ForEver
EndIf