IsKeyboardShortcut(#Window, Shortcut)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Hyper
Beiträge: 194
Registriert: 19.04.2005 19:14

IsKeyboardShortcut(#Window, Shortcut)

Beitrag 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?
PB 5.72
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: IsKeyboardShortcut(#Window, Shortcut)

Beitrag 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
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: IsKeyboardShortcut(#Window, Shortcut)

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: IsKeyboardShortcut(#Window, Shortcut)

Beitrag 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.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Hyper
Beiträge: 194
Registriert: 19.04.2005 19:14

Re: IsKeyboardShortcut(#Window, Shortcut)

Beitrag 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.
PB 5.72
Antworten