Tastatureingaben in einem Fenster auswerten

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Darkman1
Beiträge: 13
Registriert: 28.03.2008 10:02
Wohnort: Bad Vilbel

Tastatureingaben in einem Fenster auswerten

Beitrag von Darkman1 »

Nun hoffe ich inständig im Folgenden nicht die xte Lösung des Problems "Wie kann ich die Tastatur abfragen" zu präsentieren. Mir ist wohl bewusst, dass es etliche Hinweise in verschiedenen Threats gibt. Und ganz bestimmt ist das hier nichts besonderes. Ich denke dabei nur an den Nächsten der ebenfalls kein Spiel programmieren sondern in einer Windows-Applikation die Tastatur verarbeiten muss. Der folgende Code ist nicht vollständig - nicht alle Tasten werden ausgewertet - aber der Code kann das Grundgerüst für die Verarbeitung aller Tasten und Tastenkombinationen sein. Eine entsprechende Erweiterung dürfte den meisten nicht schwer fallen. Viel Spaß damit!

Code: Alles auswählen


mainwin.l       =1
GAKS.l          =0
#lib_user       =1
key.c           =0
shiftstatus.l   =0

If OpenWindow(mainwin, 0, 0, 320, 200, "Keyboard-Test",#PB_Window_MinimizeGadget)And CreateGadgetList(WindowID(mainwin))
  ListViewGadget(mainwin, 10, 10, 300,180)
  AddGadgetItem(mainwin, 0, "") 
  AddGadgetItem(mainwin, 1, "") 
  AddGadgetItem(mainwin, 2, "") 
  ;Adresse von "GetAsyncKeyState" innerhalb der "user32" ermitteln und GAKS zuweisen
  If OpenLibrary(#lib_user, "user32")
    GAKS = GetFunction(#lib_user, "GetAsyncKeyState")
  EndIf

  Repeat
    Event=WindowEvent()
    If Event=256 ;Keypress detected
      key=EventwParam() ;Value of the key in ascii
    EndIf
    If key=$1B ;if ESC key is pressed, terminate application
      End
    Else
      SetGadgetItemText(mainwin, 0,RSet(Bin(key),32,"0")+"  $"+Hex(key))
    EndIf
    ;SHIFT-Taste überprüfen + anzeigen
    If GAKS
      shiftstatus=CallFunctionFast(GAKS, 16):;16=SHIFT-Taste
      SetGadgetItemText(mainwin, 1,RSet(Bin(shiftstatus),32,"0")+"  $"+Hex(shiftstatus))
    EndIf
    
    ;Aus key und shiftstatus basteln wir nun die echten Zeichen zusammen:
    If (key>=$41) And (key<=$5A) :;key>="A" and key<="Z"
      If (shiftstatus&$8000)=0 : ;SHIFT ist nicht gedrückt
        key=key+$20
      EndIf
      SetGadgetItemText(mainwin, 2,Chr(key)+"  $"+Hex(key))
    EndIf
    
    If (key>=$30) And (key<=$39) :;key>="0" and key<="9"
      If (shiftstatus&$8000)=0 : ;SHIFT ist nicht gedrückt
        SetGadgetItemText(mainwin, 2,Chr(key)+"  $"+Hex(key))
      Else
        ;Hier müssten nun die Zeichen !"§$%&/()= behandelt werden
      EndIf
    EndIf
    
    If (key=$BC) : ;Scancode des Kommas
      If (shiftstatus&$8000)=0 : ;SHIFT ist nicht gedrückt
        key=Asc(",")
        SetGadgetItemText(mainwin, 2,Chr(key)+"  $"+Hex(key))
      Else
        ;Hier müsste nun das Zeichen ; (Semikolon) behandelt werden
      EndIf
    EndIf
    
    If key=$20 : ;key>=" " Blank
      SetGadgetItemText(mainwin, 2,Chr(key)+"  $"+Hex(key))
    EndIf
    
    Delay(10) ;don't take all CPU power
  ForEver
EndIf
Sollte jemandem Teile des Codes bekannt vorkommen: Das ist kein Zufall, ich habe fleißig aus mehreren Quellen kopiert und bedanke mich ausdrücklich bei allen die diese Vorarbeit geleistet haben :wink:

Diese blöden "if key=xx" nerven mich. Gibt's kein

Code: Alles auswählen

select
   case $41
   case $42
      ;Code für $41 UND $42
endselect
wie bei C??

EDIT: Doch, gibt's. Streicht diese Frage :oops:
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

>> wie bei C
bedenke aber, dass immer nur höchstens ein zweig ausgeführt wird (ein case, oder das optionale default) ..oder keiner.
my pb stuff..
Bild..jedenfalls war das mal so.
Darkman1
Beiträge: 13
Registriert: 28.03.2008 10:02
Wohnort: Bad Vilbel

Beitrag von Darkman1 »

>> wie bei C
bedenke aber, dass immer nur höchstens ein zweig ausgeführt wird (ein case, oder das optionale default) ..oder keiner.


Ja, ja, schon klar. Bei PB wird "aufgezählt" .....
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Einfach hinter dem Case mit Kommas abtrennen.

Ich kann es aber gar nicht haben, wenn man die Werte der Konstanten so in
den Code schreibt. Da blickt man nicht mehr durch. Wieso benutzt du nicht
'#VK_Escape', '#VK_F1', usw.? So ist das schlechter Programmierstil.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

da stimme ich zu.
konstanten bei ihrem wert zu benennen statt bei ihrem namen ist heutzutage schlechter stil.

...geht das nicht auch mit #PB_Key_ statt mit #VK_ ?
#PB_Key_ hätte den Vorteil, dass es cross-platform ist....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

'EventwParam()' ist ja auch nur Windows only. Also kann man auch '#VK_...'
nutzen. Außerdem glaube ich, dass '#PB_Key_...' die DirectX-Konstanten
sind.
Darkman1
Beiträge: 13
Registriert: 28.03.2008 10:02
Wohnort: Bad Vilbel

Beitrag von Darkman1 »

Ich habe PB erst seit 2, 3 Tagen und muss mich erstmal in die Syntax reinfinden. Habe vorher mit IBasic programmiert - aber das ist ja gestorben und mit toter Software mag ich nicht weiter machen. Also lasst mir etwas Zeit und ich werden mich schon anpassen. Mit stilistischen Feinheiten habe ich mich überhaupt noch nicht beschäftigt, das kommt im Laufe der Zeit 8)
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Es geht im übrigen sehr viel einfacher, wenn es dir nur um den Ascii-Wert der gedrückten Taste geht:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 320, 200, "Keyboard-Test", #PB_Window_MinimizeGadget) And CreateGadgetList(WindowID(0))
	ListViewGadget(0, 10, 10, 300,180)
	AddGadgetItem(0, 0, "")
	AddGadgetItem(0, 1, "")

	Repeat
		Select WaitWindowEvent()
			Case #WM_CHAR ;Keypress detected
				Key.l = EventwParam()
				SetGadgetItemText(0, 0, RSet(Bin(Key), 32, "0") + "  $" + Hex(Key))
				SetGadgetItemText(0, 1, Chr(Key) + "  $" + Hex(Key))
			Case #PB_Event_CloseWindow
				Break
		EndSelect
	ForEver
EndIf
Darkman1
Beiträge: 13
Registriert: 28.03.2008 10:02
Wohnort: Bad Vilbel

Beitrag von Darkman1 »

@HeXOR
Ja, klar, aber da fällt die Auswertung der Shift-Taste (oder Strg, oder Alt) komplett unter den Tisch - Strg und Alt liefern irgendein anderes Bit, nicht Bit 15. Aber das ist ja leicht herauszufinden.....
Olaf Scholz, BM f. Arbeit u. Soziales: ...das ist mehr als wenn es weniger gewesen wäre.
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Da du aber offensichtlich ein Terminal Programm machen willst, brauchst du i.d.R. nicht die Sondertasten (die ja gar nicht übertragen werden, sondern nur dazu dienen spezielle Zeichen auf einer Tastatur mit weniger als 256 Tasten zu erzeugen), sondern nur die Ascii-Zeichen.

Zumindest habe ich das in meinem V24-Terminal so gemacht.
Antworten