Seite 1 von 2

Keyboard-Shortcut mit Tab-Taste

Verfasst: 26.01.2020 19:13
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

Re: Keyboard-Shortcut mit Tab-Taste

Verfasst: 26.01.2020 20:26
von Nino
Hilft dir dieser Code von netmaestro weiter?

Re: Keyboard-Shortcut mit Tab-Taste

Verfasst: 27.01.2020 00:02
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.

Re: Keyboard-Shortcut mit Tab-Taste

Verfasst: 27.01.2020 00:38
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.

Re: Keyboard-Shortcut mit Tab-Taste

Verfasst: 27.01.2020 13:49
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.

Re: Keyboard-Shortcut mit Tab-Taste

Verfasst: 27.01.2020 14:37
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

Re: Keyboard-Shortcut mit Tab-Taste

Verfasst: 27.01.2020 15:26
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

Re: Keyboard-Shortcut mit Tab-Taste

Verfasst: 28.01.2020 13:11
von Nino
@Andesdaf:
Ich hatte dich völlig falsch verstanden. Tut mir leid! :oops:

Re: Keyboard-Shortcut mit Tab-Taste

Verfasst: 28.01.2020 13:53
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:

Re: Keyboard-Shortcut mit Tab-Taste

Verfasst: 28.01.2020 13:54
von mk-soft
Bug report bereits geschrieben :wink: