Keyboard-Shortcut mit Tab-Taste

Für allgemeine Fragen zur Programmierung mit PureBasic.
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Keyboard-Shortcut mit Tab-Taste

Beitrag von Andesdaf »

Hallo,

ich aktiviere zeitweise per AddKeyboardShortcut einen Shortcut auf die Tab-Taste, um mehrfache Eingaben
in ein StringGadget realisieren zu können. Durch das Belegen der Tab-Taste mit dem Shortcut wird aber
die "herkömmliche" Tab-Funktionalität, also das Springen entlang der Z-Order, dauerhaft deaktiviert.

Gibt es eine Möglichkeit, diese nach Freigabe des Shortcuts (RemoveKeyboardShortcut) wiederherzustellen
oder muss ich doch einen Keyboard-Hook nutzen?

Zur Illustration:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 110, 80, "ABC", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
  ButtonGadget(0, 5, 5, 100, 20, "Tab-Shortcut", #PB_Button_Toggle)
  
  StringGadget(1, 5, 30, 100, 20, "AA")
  StringGadget(2, 5, 55, 100, 20, "BB")
  
EndIf

Repeat
  iEvent = WaitWindowEvent()
  
  If iEvent = #PB_Event_Gadget And EventGadget() = 0
    If GetGadgetState(0) = 1
      AddKeyboardShortcut(0, #PB_Shortcut_Tab, 0)
    Else
      RemoveKeyboardShortcut(0, #PB_Shortcut_Tab)
      ; hier normale Tab-Funktion wiederherstellen
    EndIf
  ElseIf iEvent = #PB_Event_Menu And EventMenu() = 0
    Debug "Tab"
  EndIf
  
Until iEvent = #PB_Event_CloseWindow
Win11 x64 | PB 6.20
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Keyboard-Shortcut mit Tab-Taste

Beitrag von Nino »

Hilft dir dieser Code von netmaestro weiter?
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Keyboard-Shortcut mit Tab-Taste

Beitrag von Andesdaf »

Genau so (per Focus/LostFocus), nur eben mit Tab statt Return, mache ich es bereits.
Führt leider zu dem beschriebenen Problem. Danke trotzdem.
Win11 x64 | PB 6.20
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Keyboard-Shortcut mit Tab-Taste

Beitrag von Nino »

Naja, du kannst natürlich das StringGadget nicht wieder mit der Tab-Taste verlassen, nachdem du deren Funktion innerhalb des StringGadgets umprogrammiert hast. Du könntest zum Verlassen des StringGadgets z.B. Strg+Tab benutzen. Oder du programmierst die Funktion der Tab-Taste nicht um, und benutzt innerhalb des StringGadgets z.B. Strg+Tab, um Chr(9) einzufügen.
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Keyboard-Shortcut mit Tab-Taste

Beitrag von Andesdaf »

Vielleicht nochmal zum Verständnis:

ich habe z.B. drei StringGadgets, jedes soll Werte für einen Datensatz aufnehmen. Jeder Datensatz enthält
Zwischenwerte und einen endgültigen Wert (Zahlenwerte), die ich nun Datensatz für Datensatz eintragen
möchte. Zuerst für einen Datensatz die Zwischenwerte, dann seinen Endwert, dann das gleiche für den
nächsten Datensatz. Da das "Weiterspringen" mit der Tab-Taste intuitiv und schnell ist (es kommt bei der
Eingabe auch auf Schnelligkeit an), möchte ich diese dafür nutzen.

Ich klicke also in das erste StringGadget, das zum ersten Datensatz gehört (= Focus). Der Tab-Shortcut wird
aktiviert. Ich trage den ersten Zwischenwert ein und drücke Tab, um diesen in eine Datenbank zu übernehmen.
Der Wert wird übernommen, das eben genutzte StringGadget bleibt aktiv und wird für die Aufnahme des zweiten
Zwischenwerts vorbereitet. Das ist die geänderte Funktion der Tab-Taste. Das ganze wird solange wiederholt, bis
alle Zwischenwerte und der Endwert eingegeben worden sind, danach wird zum nächsten StringGadget (= nächster
Datensatz) gesprungen. Das klappt soweit auch alles wunderbar.

Mein Problem ist nun: wenn ich die Eingabemaske verlasse (=LostFocus) oder alle Werte eingetragen sind, wird der
Shortcut auf die Tab-Taste aufgehoben (RemoveKeyboardShortcut), weil ja nichts mehr in die Datenbank eingetragen
werden muss. Allerdings kann ich nun in thematisch völlig anderen Bereichen des Programms nicht mehr per Tab-Taste
navigieren, sprich entlang der Z-Order die Elemente per Tastatur ansprechen. Der mit PB definierte Shortcut scheint
genau dieses Verhalten im Programm dauerhaft zu überschreiben, wird der Shortcut freigegeben, kehrt das Standardverhalten
nicht zurück. Meine Frage war nun, ob es möglich ist, dieses Standardverhalten irgendwie wiederherzustellen.
Win11 x64 | PB 6.20
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Keyboard-Shortcut mit Tab-Taste

Beitrag von Mijikai »

I tried this without success :S

Code:

Code: Alles auswählen

Macro SetTabStop(_hwnd_)
  SetWindowLongPtr_(_hwd_,#GWL_STYLE,GetWindowLongPtr_(hwnd,#GWL_STYLE)|#WS_TABSTOP)
  SetWindowLongPtr_(_hwd_,#GWL_EXSTYLE,GetWindowLongPtr_(_hwnd_,#GWL_EXSTYLE)|#WS_EX_CONTROLPARENT)
  SetWindowPos_(_hwnd_,#Null,#Null,#Null,#Null,#Null,#SWP_NOMOVE|#SWP_NOSIZE|#SWP_NOZORDER|#SWP_FRAMECHANGED)
  UpdateWindow_(_hwnd_)
  SetForegroundWindow_(_hwnd_)
  SetFocus_(_hwnd_)
EndMacro
Benutzeravatar
mk-soft
Beiträge: 3871
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Keyboard-Shortcut mit Tab-Taste

Beitrag von mk-soft »

Ist meiner Meinung nach ein Bug. Bei macOS geht es..

Habe aber eine Lösung Windows gefunden.

Code: Alles auswählen

;-TOP

#MenuItem_TabKey = 1001

Global TabOn = #True

Procedure DoEventTabKey()
  Protected hWnd, gadget
  If TabOn
    gadget = GetActiveGadget()
    If gadget >= 0
      hWnd = GetNextDlgTabItem_(WindowID(GetActiveWindow()), GadgetID(gadget), 0)
      If hWnd
        SetFocus_(hWnd)
      EndIf
    EndIf
  EndIf
EndProcedure

If OpenWindow(0, 0, 0, 110, 80, "ABC", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
  CreateMenu(0, WindowID(0))
  ButtonGadget(0, 5, 5, 100, 20, "Tab-Shortcut")
  StringGadget(1, 5, 30, 100, 20, "AA")
  StringGadget(2, 5, 55, 100, 20, "BB")
  
  BindMenuEvent(0, #MenuItem_TabKey, @DoEventTabKey())
  AddKeyboardShortcut(0, #PB_Shortcut_Tab, #MenuItem_TabKey)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
      Case #PB_Event_Gadget 
        Select EventGadget()
          Case 0
            If TabOn
              TabOn = #False
              Debug "Tab Off"
            Else
              TabOn = #True
              Debug "Tab On"
            EndIf
        EndSelect
    EndSelect
  ForEver
EndIf
Zuletzt geändert von mk-soft am 28.01.2020 13:48, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Keyboard-Shortcut mit Tab-Taste

Beitrag von Nino »

@Andesdaf:
Ich hatte dich völlig falsch verstanden. Tut mir leid! :oops:
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Keyboard-Shortcut mit Tab-Taste

Beitrag von Andesdaf »

@mk-soft: Danke, so eine ähnliche Lösung hatte ich auch bereits gefunden. Scheint nicht anders zu gehen, dann mache ich das eben so.
Vielleicht schreibe ich noch einen Bugreport drüben.

@Nino: halb so wild :wink:
Win11 x64 | PB 6.20
Benutzeravatar
mk-soft
Beiträge: 3871
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Keyboard-Shortcut mit Tab-Taste

Beitrag von mk-soft »

Bug report bereits geschrieben :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten