Tastatureingaben in einem Fenster auswerten
Verfasst: 31.03.2008 22:49
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!
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 
Diese blöden "if key=xx" nerven mich. Gibt's kein
wie bei C??
EDIT: Doch, gibt's. Streicht diese Frage
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

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
EDIT: Doch, gibt's. Streicht diese Frage
