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!

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

Re: Keyboard-Shortcut mit Tab-Taste
Verfasst: 28.01.2020 13:54
von mk-soft
Bug report bereits geschrieben
