Seite 1 von 1

Tastatureingaben in einem Fenster auswerten

Verfasst: 31.03.2008 22:49
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:

Verfasst: 31.03.2008 23:48
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.

Verfasst: 31.03.2008 23:59
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" .....

Verfasst: 01.04.2008 08:52
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.

Verfasst: 01.04.2008 08:57
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....

Verfasst: 01.04.2008 09:06
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.

Verfasst: 01.04.2008 14:16
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)

Verfasst: 01.04.2008 15:03
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

Verfasst: 02.04.2008 00:01
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.....

Verfasst: 02.04.2008 08:14
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.