Описание функции
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