PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Горячие клавиши в русской раскладке не работают


Горячие клавиши в русской раскладке не работают

Сообщений 1 страница 8 из 8

1

Вот пример регистрации горячих клавиш. Но виртуальные коды задаются только для латинских букв, и в русской раскладке не работает. Как заставить это работать? В 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

0

2

В Win7 нормально работает при русской и английской раскладке.

0

3

У меня Win10 x64 1809, в русской раскладке не работает, даже полный тест с компиляций и вставка мессаги, в англ. вылетает, переключил в Ru, нет реакции, опять в En, опять работает.

0

4

AZJIO написал(а):

У меня Win10 x64 1809

Проверил на Win10 x64 1709.
Нормально работает, как при русской так и при английской раскладке.

0

5

Нативный ShortcutGadget не позволяет использовать некоторые символы не являющиеся буквами как горячие клавиши. Попробовал использовать WinAPI используя пример на AutoIt3 и получился рабочий вариант.

Код:
EnableExplicit

Enumeration Gadget
	#GadgetHK
	#btnApply
EndEnumeration

Enumeration Hotkey
	#HK_ID = 1001
; 	#HK_ID2
EndEnumeration

#Window = 0

Define HotkeyCode.l
Define VirtKey
Define ModKey
Define hGUI, hHotkey, hFont
Define flgHK

; Not a required function, only to save to an ini file
Procedure.s GetKey(HotkeyCode)
	Protected ModKey, Key$, sep$ = " + "
	ModKey = HotkeyCode >> 8
	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 & $FF)
	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
	hHotkey = CreateWindowEx_(0, #HOTKEY_CLASS, 0, #WS_CHILD | #WS_VISIBLE | #WS_TABSTOP,10, 10, 200, 25, hGUI, 0, 0, 0)
	SendMessage_(hHotkey, #HKM_SETHOTKEY, #PB_Shortcut_J | (#HOTKEYF_CONTROL << 8), 0)
	hFont = LoadFont(0, "Arial", 11)
	If hFont
    SendMessage_(hHotkey, #WM_SETFONT, hFont, #True)
	EndIf
	ButtonGadget(#btnApply, 10, 40, 100, 28, "Apply")
	Repeat
    Select WaitWindowEvent()
    	Case #WM_HOTKEY
        Select EventwParam()
        	Case #HK_ID
            Debug "hotkey called"
            MessageRequester("", "1") ; for a test of a compiled program
        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 = SendMessage_(hHotkey, #HKM_GETHOTKEY, 0, 0)
            If Not HotkeyCode
            	Debug "Cancel the hotkey (Backspace)"
            	flgHK = 0
            	Continue
            EndIf
            Debug HotkeyCode
            Debug GetKey(HotkeyCode)
            ModKey = GetModKey(HotkeyCode >> 8) ; HiWord
            VirtKey = HotkeyCode & $FF ; LoWord
            If RegisterHotKey_(hGUI, #HK_ID, ModKey, VirtKey)
            	flgHK = 1
            Else
            	Debug "Failed to register hotkey"
            	flgHK = 0
            EndIf
        EndSelect
    	Case #PB_Event_CloseWindow
        DestroyWindow_(hHotkey)
        If flgHK
        	UnregisterHotKey_(hGUI, #HK_ID)
        EndIf
        CloseWindow(#Window)
        End
    EndSelect
	ForEver
EndIf

Интересный момент, использовал изначально GetStockObject_(#DEFAULT_GUI_FONT) чтобы получить дескриптор шрифта окна, он почему то вернул мелкий шрифт 9, в то время когда у меня во всех окнах используется шрифт 11, пришлось загружать шрифт, теперь не понятно как задать действительно тот размер который пользователь задал в интерфейсе своей Windows, разве что взять как из программы WindowsFont

Отредактировано AZJIO (19.02.2022 18:19:25)

0

6

всё это есть в реестре, может напрямую читать\писать
для хрюнделя есть Neo Tweaker, он показывает где что лежит в реестре
может он и на старших будет работать
для 10 есть свой, мне не понравился, толку почти нет от него

0

7

newJS
Не понял, что есть в реестре? Как это связано с горячими клавишами?

0

8

вся эта инфа в реестре находится
все настройки в реестре хранятся
я тебе и предлогаю напрямую с реестром работать

другие проги тоже не всё дают поменять, недавно с этим столкнулся, так и не поменял как мне хотелось

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Горячие клавиши в русской раскладке не работают