Seite 1 von 1
IsKeyboardShortcut(#Window, Shortcut)
Verfasst: 02.02.2022 16:29
von Hyper
Hallo Gefährten,
gibt es eine Möglichkeit, herauszufinden, ob ein Shortcut mittels AddKeyboardShortcut(#Window, Shortcut, Event) registriert wurde?
Hintergrund: In bestimmten Prozeduren brauche ich betimmte Menüereignisse und will die dort hinzufügen. Am Ende der Prozedur würde ich sie dann gern wieder entfernen. Das darf ich natürlich nur dann machen, wenn der Shortcut noch nicht vorher registriert war.
Ich bräuchte also soetwas wie IsKeyboardShortcut(#Window, Shortcut) mit Ergebnis #True/#False.
Hat jemand eine Idee?
Re: IsKeyboardShortcut(#Window, Shortcut)
Verfasst: 10.02.2022 22:50
von ccode_new
Hallo!
Du könntest z.B. eine Liste nehmen.
Beispiel:
Code: Alles auswählen
EnableExplicit
Global NewList KeyList.i()
Global.i WinEvent, Quit
Declare.b IsKeyboardShortcut(Window.i, List Shortcut_List.i(), Shortcut.i)
Declare.i AddKeyboardShortcut2(Window.i, List Shortcut_List.i(), Shortcut.i, Event.i)
Procedure.b IsKeyboardShortcut(Window.i, List Shortcut_List.i(), Shortcut.i)
If IsWindow(Window)
If ListSize(Shortcut_List()) > 0
ForEach Shortcut_List()
If Shortcut = Shortcut_List()
ProcedureReturn #True
EndIf
Next
ProcedureReturn #False
Else
ProcedureReturn #False
EndIf
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure.i AddKeyboardShortcut2(Window.i, List Shortcut_List.i(), Shortcut.i, Event.i)
If IsWindow(Window)
AddKeyboardShortcut(Window, Shortcut, Event)
AddElement(Shortcut_List())
KeyList() = Shortcut
ProcedureReturn 0
Else
ProcedureReturn -1
EndIf
EndProcedure
;-Main
If OpenWindow(0, 0, 0, 200, 200, "Key-Windows", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
AddKeyboardShortcut2(0, KeyList(), #PB_Shortcut_Control | #PB_Shortcut_Q, 1)
AddKeyboardShortcut2(0, KeyList(), #PB_Shortcut_Control | #PB_Shortcut_W, 2)
AddKeyboardShortcut2(0, KeyList(), #PB_Shortcut_Control | #PB_Shortcut_E, 3)
AddKeyboardShortcut2(0, KeyList(), #PB_Shortcut_Control | #PB_Shortcut_R, 4)
AddKeyboardShortcut2(0, KeyList(), #PB_Shortcut_Control | #PB_Shortcut_T, 5)
AddKeyboardShortcut2(0, KeyList(), #PB_Shortcut_Control | #PB_Shortcut_Z, 6)
If IsKeyboardShortcut(0, KeyList(), #PB_Shortcut_Control | #PB_Shortcut_P)
Debug "Der Shortcut wurde registriert."
Else
Debug "Der Shortcut wurde nicht registriert."
EndIf
If IsKeyboardShortcut(0, KeyList(), #PB_Shortcut_Control | #PB_Shortcut_Z)
Debug "Der Shortcut wurde registriert."
Else
Debug "Der Shortcut wurde nicht registriert."
EndIf
Repeat
WinEvent = WaitWindowEvent()
If WinEvent = #PB_Event_CloseWindow ; If the user has pressed on the close button
Quit = 1
EndIf
Until Quit = 1
EndIf
End
Re: IsKeyboardShortcut(#Window, Shortcut)
Verfasst: 11.02.2022 01:48
von mk-soft
Sorry, code_new
Lass doch bitte den .b (byte) für Boolean weg. Das hilft nicht und verursacht nur unnötigen ASM code im Hintergrund.
Eine Boolean als Rückgabewert ist immer ein ganzes Register bei x64 ein RAX oder bei x86 ein EAX. Ausserdem kann es bei C-backend mit Optimierung zu Fehler führen, da es weg optimiert wird.
Re: IsKeyboardShortcut(#Window, Shortcut)
Verfasst: 11.02.2022 17:23
von ccode_new
@mk-soft:
Sorry!
Die Macht der Gewohnheit.
Eigentlich weiß ich ja auch das es keinen Sinn macht "b" als Rückgabewert zu nutzen.
mk-soft hat geschrieben: 11.02.2022 01:48
Eine Boolean als Rückgabewert ist immer ein ganzes Register bei x64 ein RAX oder bei x86 ein EAX. Ausserdem kann es bei C-backend mit Optimierung zu Fehler führen, da es weg optimiert wird.
Danke für den Hinweis.
Re: IsKeyboardShortcut(#Window, Shortcut)
Verfasst: 25.04.2022 17:30
von Hyper
Vielen Dank - das ist eine tolle Lösung!
Schade dass wir so eine Schatten-Logik brauchen, um es uns zu merken. Ich dachte, es gäbe evtl. eine Funktion (API o.ä.), um das direkt abzufragen. Wäre evtl. eine Verbesserungsidee für PB. Danke nochmals.