Tastaturevents weiterleiten

Anfängerfragen zum Programmieren mit PureBasic.
lukanga
Beiträge: 12
Registriert: 19.06.2007 22:23
Wohnort: Griesheim

Tastaturevents weiterleiten

Beitrag von lukanga »

Hallo,

mit AddKeyboardShortcut kann man Tastaturevents selber verarbeiten. Ich möchte sie allerdings nur selber verarbeiten, wenn sich der Fokus in ganz bestimmten Gadgets befindet und im anderen Fall dem System die Verarbeitung überlassen. Wie geht denn sowas?

Hier ein Beispielcode:

Code: Alles auswählen

Enumeration
  #ListIcon_1 : #ListIcon_2 : #String_1 : #String_2 : #String_3 : #String_4
EndEnumeration

Procedure Open_Window()
  If OpenWindow(0, 216, 0, 500, 300, "Shortcut-Test",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateGadgetList(WindowID(0))
      ListIconGadget(#ListIcon_1,20,10,200,200,"Spalte1",100) 
      AddGadgetColumn(#ListIcon_1, 1, "Spalte2", 100)
      ListIconGadget(#ListIcon_2,230,10,200,200,"Spalte1",100) 
      AddGadgetColumn(#ListIcon_2, 1, "Spalte2", 100)
      StringGadget(#String_1, 20, 250, 100, 20, "String1")
      StringGadget(#String_2, 130, 250, 100, 20, "String2")
      StringGadget(#String_3, 240, 250, 100, 20, "String3")
      StringGadget(#String_4, 350, 250, 100, 20, "String4")
    EndIf
  EndIf
EndProcedure

Open_Window()
AddKeyboardShortcut(0, #PB_Shortcut_Tab,  100) 

AddGadgetItem (#ListIcon_1, 0,"Zeile1")
AddGadgetItem (#ListIcon_1, 1,"Zeile2")
AddGadgetItem (#ListIcon_1, 2,"Zeile3")
AddGadgetItem (#ListIcon_2, 0,"Zeile1")
AddGadgetItem (#ListIcon_2, 1,"Zeile2")
AddGadgetItem (#ListIcon_2, 2,"Zeile3")

SetGadgetItemState(#ListIcon_2, 0, #PB_ListIcon_Selected )
SetGadgetItemState(#ListIcon_1, 0, #PB_ListIcon_Selected )
SetActiveGadget(#ListIcon_1)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
    Case #PB_Event_Menu
      Select EventMenu()
        Case 100
          AktGadget = GetActiveGadget()
          If AktGadget = #ListIcon_1
            SetActiveGadget(#ListIcon_2)
          ElseIf AktGadget = #ListIcon_2
            SetActiveGadget(#ListIcon_1)
          ElseIf AktGadget = #String_4    ; Sonderfall
            SetActiveGadget(#string_1)
          Else
            ; Fokus in Stringgadget 1-3,
            ; sollen vom System bearbeitet werden
          EndIf
      EndSelect
  EndSelect
ForEver
Ich möchte mit der Tab-Taste zwischen Listicon_1 und Listicon_2 hin und herspringen, das funktioniert. Befindet sich der Fokus in einem der StringGadgets soll er zum jeweils nächsten Feld springen. Ganz normal so, wie wenn man die Taste nicht abfängt.

Ich kann mein Programm leicht so erweitern, dass es so funktioniert, wie ich will. Es geht mir aber ums Prinzip.

Vielen Dank im Voraus!
PB4.02 WinXP
Irgendwann steig' ich auf Linux um!
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

In Deinem Code fehlte nicht viel 8)

Code: Alles auswählen

Enumeration 
  #ListIcon_1 : #ListIcon_2 : #String_1 : #String_2 : #String_3 : #String_4 
EndEnumeration 

Procedure Open_Window() 
  If OpenWindow(0, 216, 0, 500, 300, "Shortcut-Test",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
    If CreateGadgetList(WindowID(0)) 
      ListIconGadget(#ListIcon_1,20,10,200,200,"Spalte1",100) 
      AddGadgetColumn(#ListIcon_1, 1, "Spalte2", 100) 
      ListIconGadget(#ListIcon_2,230,10,200,200,"Spalte1",100) 
      AddGadgetColumn(#ListIcon_2, 1, "Spalte2", 100) 
      StringGadget(#String_1, 20, 250, 100, 20, "String1") 
      StringGadget(#String_2, 130, 250, 100, 20, "String2") 
      StringGadget(#String_3, 240, 250, 100, 20, "String3") 
      StringGadget(#String_4, 350, 250, 100, 20, "String4") 
    EndIf 
  EndIf 
EndProcedure 

Open_Window() 
AddKeyboardShortcut(0, #PB_Shortcut_Tab,  100) 

AddGadgetItem (#ListIcon_1, 0,"Zeile1") 
AddGadgetItem (#ListIcon_1, 1,"Zeile2") 
AddGadgetItem (#ListIcon_1, 2,"Zeile3") 
AddGadgetItem (#ListIcon_2, 0,"Zeile1") 
AddGadgetItem (#ListIcon_2, 1,"Zeile2") 
AddGadgetItem (#ListIcon_2, 2,"Zeile3") 

SetGadgetItemState(#ListIcon_2, 0, #PB_ListIcon_Selected ) 
SetGadgetItemState(#ListIcon_1, 0, #PB_ListIcon_Selected ) 
SetActiveGadget(#ListIcon_1) 

Repeat 
  Select WaitWindowEvent() 
    Case #PB_Event_CloseWindow 
      End 
    Case #PB_Event_Menu 
      Select EventMenu() 
        Case 100 
          Select GetActiveGadget() 
            Case #ListIcon_1
              SetActiveGadget(#ListIcon_2) 
            Case #ListIcon_2 
              SetActiveGadget(#ListIcon_1) 
            Case #String_1
              SetActiveGadget(#String_2)
            Case #String_2
              SetActiveGadget(#String_3)
            Case #String_3
              SetActiveGadget(#String_4)
            Case #String_4
              SetActiveGadget(#String_1)
          EndSelect
      EndSelect 
  EndSelect 
ForEver
lukanga
Beiträge: 12
Registriert: 19.06.2007 22:23
Wohnort: Griesheim

Tastaturevents weiterleiten

Beitrag von lukanga »

Das ist die Lösung, die ich kenne!

Mein Programm ist nur ein kleiner Teil aus einem größeren Projekt, in dem ich an mehreren Stellen das gleiche Problem habe, dass ich ein Event im Sonderfall selber bearbeiten möchte und ansonsten zur Weiterverarbeitung an das System weitergeben möchte.

Trotzdem vielen Dank!
PB4.02 WinXP
Irgendwann steig' ich auf Linux um!
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

Schau Dir mal SetWindowCallback() an. Damit kannst Du sowas wesentlich eleganter lösen, musst Dich aber mit dem Event-Handling von Windoof ein wenig rumschlagen. Wenn Du's für Linux/Mac brauchst kannst Du das - glaub ich - so nicht machen.
lukanga
Beiträge: 12
Registriert: 19.06.2007 22:23
Wohnort: Griesheim

Beitrag von lukanga »

Ich habe eine Lösung gefunden! Ohne Windows!:

Beim Fokuserhalt eines Gadgets füge ich einen Tatatur-Shortcut hinzu, bzw. entferne ihn (AddKeyboardShortcut/RemoveKeyboardShortcut), je nachdem ob ich eine eigene Eventbehandlung oder die vom System wünsche.

Für die Backspace-Taste funktioniert dies sehr gut, die ich ebenfalls bei den ListIcons mit einer Sonderfunktion belegen möchte.
Wahrscheinlich geht es mit allen Tasten, außer der Tab-Taste, mit RemoveKeyboardShortcut verliert die Taste jede Funktionalität und erhält nicht, wie bei anderen Tasten, die Systemfunktionalität.

Jetzt bleibt nur die Frage, ob der Wert 49351 der richtige ist für den Fokuserhalt. Weiß jemand, ob es dafür eine Konstante gibt?

Code: Alles auswählen

Enumeration
  #ListIcon_1 : #ListIcon_2 : #String_1 : #String_2 : #String_3 : #String_4
EndEnumeration

Procedure Open_Window()
  If OpenWindow(0, 216, 0, 500, 300, "Shortcut-Test",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateGadgetList(WindowID(0))
      ListIconGadget(#ListIcon_1,20,10,200,200,"Spalte1",100)
      AddGadgetColumn(#ListIcon_1, 1, "Spalte2", 100)
      ListIconGadget(#ListIcon_2,230,10,200,200,"Spalte1",100)
      AddGadgetColumn(#ListIcon_2, 1, "Spalte2", 100)
      StringGadget(#String_1, 20, 250, 100, 20, "String1")
      StringGadget(#String_2, 130, 250, 100, 20, "String2")
      StringGadget(#String_3, 240, 250, 100, 20, "String3")
      StringGadget(#String_4, 350, 250, 100, 20, "String4")
    EndIf
  EndIf
EndProcedure

Open_Window()
AddKeyboardShortcut(0, #PB_Shortcut_Tab,  100)

AddGadgetItem (#ListIcon_1, 0,"Zeile1")
AddGadgetItem (#ListIcon_1, 1,"Zeile2")
AddGadgetItem (#ListIcon_1, 2,"Zeile3")
AddGadgetItem (#ListIcon_2, 0,"Zeile1")
AddGadgetItem (#ListIcon_2, 1,"Zeile2")
AddGadgetItem (#ListIcon_2, 2,"Zeile3")

SetGadgetItemState(#ListIcon_2, 0, #PB_ListIcon_Selected )
SetGadgetItemState(#ListIcon_1, 0, #PB_ListIcon_Selected )
SetActiveGadget(#ListIcon_1)

Repeat
  Select WaitWindowEvent()
  Case 49351
    Select GetActiveGadget()
    Case #ListIcon_1
      AddKeyboardShortcut(0, #PB_Shortcut_Back,  101)
    Case #ListIcon_2
      AddKeyboardShortcut(0, #PB_Shortcut_Back,  101)
    Case #String_1
      RemoveKeyboardShortcut(0, #PB_Shortcut_Back)
    Case #String_2
      RemoveKeyboardShortcut(0, #PB_Shortcut_Back)
    Case #String_3
      RemoveKeyboardShortcut(0, #PB_Shortcut_Back)
    Case #String_4
      RemoveKeyboardShortcut(0, #PB_Shortcut_Back)
    EndSelect
  
  Case #PB_Event_Menu
    Select EventMenu()
      Case 100                           ; Tab
        Select GetActiveGadget()
        Case #ListIcon_1
          SetActiveGadget(#ListIcon_2)
        Case #ListIcon_2
          SetActiveGadget(#ListIcon_1)
        Case #String_1
          SetActiveGadget(#String_2)
        Case #String_2
          SetActiveGadget(#String_3)
        Case #String_3
          SetActiveGadget(#String_4)
        Case #String_4
          SetActiveGadget(#String_1)
        EndSelect
      Case 101                           ; Backspace      
        Select GetActiveGadget()
        Case #ListIcon_1
          MessageRequester("","Backspace: spez.Funktion ListIcon1")
          SetActiveGadget(#ListIcon_1)
        Case #ListIcon_2
          MessageRequester("","Backspace: spez.Funktion ListIcon2")
          SetActiveGadget(#ListIcon_2)
        EndSelect
    EndSelect
  Case #PB_Event_CloseWindow
    End
  EndSelect
ForEver
PB4.02 WinXP
Irgendwann steig' ich auf Linux um!
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Nimm lieber #WM_KEYDOWN
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
lukanga
Beiträge: 12
Registriert: 19.06.2007 22:23
Wohnort: Griesheim

Beitrag von lukanga »

Ich bitte um Entschuldigung, aber was soll ich denn damit?

Soll ich alle Tastendrücke analysieren und sämtliche Systemfunktionen nachbilden?

Mein Programm macht jetzt eigentlich genau das was es tun soll und es sind keine windowsspezifischen Funktionen drin.
PB4.02 WinXP
Irgendwann steig' ich auf Linux um!
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

lukanga hat geschrieben: Mein Programm macht jetzt eigentlich genau das was es tun soll und es sind keine windowsspezifischen Funktionen drin.
Und was ist das:

Code: Alles auswählen

Case 49351 
Das ist ein nicht genau spezifiziertes Windows-Ereignis!
Müßte man jetzt Bitweise zerlegen um rauszufinden, welche Windows-
Ereignisse hier kombiniert werden, dann die passende Konstante nehmen.
Sollte es ein entsprechende PB-Ereignis geben hätteste Glück, keine API zu
verwenden, ist aber mehr als unwahrscheinlich.

Du verwendest also alle Wahrscheinlichkeit nach windowsspezifische
Ereignisse, wobei Du nichtmal weißt welche es sind. Das kannste so nicht
nehmen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
lukanga
Beiträge: 12
Registriert: 19.06.2007 22:23
Wohnort: Griesheim

Beitrag von lukanga »

Stimmt!

Sag' mir bitte wie die PB-Konstante heißt, die den Fokuserhalt eines Feldes spezifiziert und dann ist das Problem gelöst.

Gibt es nicht irgendwo ein systematisches Ereignis-Verzeichnis ?

In Werkzeuge->Strukturverzeichnis->Konstanten steht ja einiges, habs passende da aber noch nicht gefunden.
PB4.02 WinXP
Irgendwann steig' ich auf Linux um!
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

#PB_EventType_Focus
Funktioniert aber nur mit einigen Gadgets, #PB_EventType_LostFocus
könnte auch hilfreich sein :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten