Вот пример регистрации горячих клавиш. Но виртуальные коды задаются только для латинских букв, и в русской раскладке не работает. Как заставить это работать? В AutoIt3 если регистрация горячих клавиш прошла при английской раскладке, то они остаются рабочими и в русской раскладке, поэтому в AutoIt3 я проверяю текущую раскладку и если она русская, то запоминаю флаг, переключаю в En, регистрирую клавиши, возвращаю Ru. В PureBasic любые варианты не приводят к полноценной работе. Есть идеи?
EnableExplicit Enumeration Gadget #GadgetHK #btnApply EndEnumeration Enumeration Hotkey #HK_ID = 1001 ; #HK_ID2 EndEnumeration #Window = 0 Define HotkeyCode Define VirtKey Define ModKey Define hGUI Define flgHK Procedure.s GetKey(HotkeyCode) Protected ModKey, Key$, sep$ = " + " ModKey = HotkeyCode >> 16 If ModKey & #HOTKEYF_CONTROL Key$ + sep$ + "Ctrl" EndIf If ModKey & #HOTKEYF_SHIFT Key$ + sep$ + "Shift" EndIf If ModKey & #HOTKEYF_ALT Key$ + sep$ + "Alt" EndIf Key$ + sep$ + Chr(HotkeyCode & $FFFF) Key$ = Mid(Key$, Len(sep$) + 1) 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 ;- GUI hGUI = OpenWindow(#Window, 0, 0, 240, 70, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) If hGUI ShortcutGadget(#GadgetHK, 10, 10, 200, 25, #PB_Shortcut_Alt | #PB_Shortcut_J) ; SetGadgetState(0 , #PB_Shortcut_Control | #PB_Shortcut_B) ; can be inserted this way ButtonGadget(#btnApply, 10, 40, 100, 28, "Apply") Repeat Select WaitWindowEvent() Case #WM_HOTKEY Select EventwParam() Case #HK_ID Debug "hotkey called" EndSelect Case #PB_Event_Gadget Select EventGadget() Case #btnApply If flgHK And Not UnregisterHotKey_(hGUI, #HK_ID) ; reassignment works without unregistering Debug "Could not unregister the hotkey" Continue EndIf HotkeyCode = GetGadgetState(#GadgetHK) If Not HotkeyCode Debug "Cancel the hotkey (Backspace)" flgHK = 0 Continue EndIf Debug HotkeyCode Debug GetKey(HotkeyCode) ModKey = GetModKey(HotkeyCode >> 16) ; HiWord VirtKey = HotkeyCode & $FFFF ; LoWord ; Debug SendMessage_(GadgetID(#GadgetHK), #HKM_GETHOTKEY, 0, 0) ; If MAKELONG(loword, hiword) If RegisterHotKey_(hGUI, #HK_ID, ModKey, VirtKey) flgHK = 1 Else Debug "Failed to register hotkey" flgHK = 0 EndIf EndSelect Case #PB_Event_CloseWindow If flgHK UnregisterHotKey_(hGUI, #HK_ID) EndIf CloseWindow(#Window) End EndSelect ForEver EndIf