Frage deutsch
~~~~~~~~~~~~~~
Wie frage ich die Tasten [Shift], [Num], [Strg], [Alt] usw. ab?
Question English
~~~~~~~~~~~~~~~
How to scan special keys like Shift, Num, Ctrl, Alt etc.?
Antwort 1
~~~~~~~~~~~~~~~~
[ von A.K. und Thomas Antoni, 23.6.2003 - 24.6.2003 ]
*** Was ist eine Sondertaste?
Sondertasten sind:
- Shift rechts
- Shift links
- STRG
- ALT/ALT GR
- Rollen-Feststelltaste (Statusanzeige durch "Rollen"-LED)
- NumLock (Num-Feststelltaste; Statusanzeige durch "Num"-LED)
- CapsLock (Shift-Feststelltaste; Statusanzeige durch "Shift"-LED)
- Einfügen (Einfügen-Modus aktiv)
Zur Abfrage dieser Sondertasten gibt es prinzipiell zwei Methoden, die im
Folgenden getrennt behandelt werden:
- Methode 1: Direkt-Abfrage des Statusbytes 00:417 (Hex) im
BIOS-Datenbereich
- Methode 2: Die Verwendung des QBasic-Befehls ON KEY (Ereignisgesteuerte
Tastenabfrage)
*** Methode 1: Direkt-Abfrage des Tastatur-Statusbytes
00:&H417
Du kannst Das Tastatur-Statusbyte 417 hex wie folgt abfragen:
DEF SEG = &H40 'BIOS-Datensegment
status% = PEEK(&H17) '&H17 = StatusByteOffset
DEF SEG 'Segment zurücksetzen
status% liefert einen Wert von 0-255 zurück.
Und so kannst Du erkennen, um welche Taste es sich handelt:
LOCATE 1,1
IF (status% AND 1) THEN PRINT "Shift rechts"
IF (status% AND 2) THEN PRINT "Shift links"
IF (status% AND 4) THEN PRINT "Strg"
IF (status% AND 8) THEN PRINT "ALT oder Alt Gr"
IF (status% AND 16) THEN PRINT "ScrollLock"
IF (status% AND 32) THEN PRINT "NumLock"
IF (status% AND 64) THEN PRINT "CapsLock"
IF (status% AND 128) THEN PRINT "Einfügen"
Wie Du siehst, ist jeder Taste ein Bit 2^n im Statusbyte zugeordnet. Der
Klammerwert in der IF-Abfrage ist nur dann > 0, wenn das entsprechende Bit
auf 1 gesetzt ist. D.h. nur dann ist das Abfrageergebnis "True" und der
THEN-Zweig wird durchlaufen.
Bei mehreren Tasten addiert man die Werte einfach.
Unser folgendes Programm zeigt den Tastenzustand aller Sondertasten an. Die
Anzeige erfolgt nur bei eingeschalteter Funktion:
'************************************************************************
' KEYSTAT.BAS - Zustandsanzeige der Sondertasten Shift, NumLock usw.
' ============
' Jedes Bit im Tastatur-Statuswort 00:417 zeigt den Zustand einer
' der Sondertasten an. Mehrfachanzeigen sind moeglich. Im naechsten
' Statusbyte werden Zusatzinformationen hinterlegt, die in diesem
' Programm jedoch nicht ausgewertet werden (Alt Gr usw.)
'
' (c) A.K. & Thomas Antoni, 24.6.2003 - 10.11.2003
'************************************************************************
DO
DEF SEG = &H40 'BIOS-Datensegment
status% = PEEK(&H17) '&H17 = StatusByteOffset
'
'** Anzeige nur, wenn sich was geaendert hat
IF status% <> statusalt% THEN
statusalt% = status%
FOR i% = 1 TO 8 'Anzeige loeschen (mit Blanks ueberschreiben)
LOCATE i%, 1
PRINT SPACE$(20)
NEXT i%
'
IF (status% AND 1) THEN LOCATE 1, 1: PRINT "Shift rechts"
IF (status% AND 2) THEN LOCATE 2, 1: PRINT "Shift links"
IF (status% AND 4) THEN LOCATE 3, 1: PRINT "STRG"
IF (status% AND 8) THEN LOCATE 4, 1: PRINT "ALT oder Alt Gr"
IF (status% AND 16) THEN LOCATE 5, 1: PRINT "Rollen"
IF (status% AND 32) THEN LOCATE 6, 1: PRINT "NumLock"
IF (status% AND 64) THEN LOCATE 7, 1: PRINT "ShiftLock"
IF (status% AND 128) THEN LOCATE 8, 1: PRINT "Einfuegen"
END IF
LOOP WHILE INKEY$ <> CHR$(27) 'Beenden mit Esc
DEF SEG 'Segment zuruecksetzen
END
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online
unter www.antonis.de/faq/progs/keystat.bas .
Bei dieser Methode ist Folgendes zu berücksichtigen: QuickBasic liefert eine
0 im Statuswort, wenn keine Taste gedrückt wurde, und bei QBasic ist es die
zuletzt gedrückte Taste.
Weißt Du eigentlich, wozu die Taste "Rollen" gut ist. Das wissen die
wenigsten PC-Nutzer. Sogar einige professionelle Programmierer konnten mir keine
Antwort darauf geben. ScrollLock bewirkt, dass in einem Dokument der Cursor in
der aktuellen Zeile stehen bleibt, wenn man sen Bildschirm mit den Cursortasten
nach oben oder unten rollt.
Diese Funktion ergab sich im alten DOS-Editor auch durch gedrückt Halten der
Strg-Taste.
Unter Windows unterstützen nur wenige Programme ScrollLock, z.B. die
Tabellenkalkulation MS Excel.
*** Methode 2: Mit dem QBasic-Befehl ON KEY
In meinem QBasic-Kochbuch (verfügbar auf www.qbasic.de ) ist die
Sondertastenabfrage mit ON KEY wie folgt beschrieben:
ON KEY (<Tastennr. 15...25>) GOSUB <Name der
Subroutine>
... realisiert das Ereignisgesteuerte Aufrufen einer Subroutine, wenn eine
Sondertaste betätigt wird
... Die Subroutine muß als 'lokale Subroutine' im Hauptprogramm definiert
sein (siehe entsprechenden Abschnitt)
... Tastennr. = 15...25 ==> benutzerdefinierte Tasten (siehe Hilfe zu ON
KEY ).
... Diese Tasten werden mit dem folgenden Befehl definiert:
KEY <Tastennr.>, CHR$(<Tastenstatus%>) +
CHR$(ScanCode%)
... Dieser Befehl muss vor dem entsprechenden ON KEY-Befehl stehen.
... Der Tastenstatus kennzeichnet Zusatztastenbetätigungen:
............0 = keine Zusatztaste gedrückt | 8 = Alt
......1,2,3 = Shift zusätzlich gedrückt | 32= NumLock aktiv
............4 = Strg zusätzlich gedrückt | 64= ShiftLock aktiv
... Der Scancode geht aus der QBasic-Hilfe hervor, erreichbar über
<Inhalt> <Kurzübersicht | Tastatur-Abfragecodes>
Das folgende Programm KEYSTAT".BAS zeigt einen entsprechenden Text an,
solange eine oder mehrere der Sondertasten gedrückt wird. Im Gegensatz zum
obenstehenden Programm KEYSTAT.BAS wird hierbei nicht der Status der
Lock-Funktionen (NumLock usw.) angezeigt, sondern nur die "nackte"
Tastenbetätigung.
'********************************************************
' KEYSTAT2.BAS - Abfrage der Sondertasten mit ON KEY
' ============
' Die Sondertasten Shift, Strg, Alt, NumLock usw. werden
' mit Hilfe des Befehls ON KEY abgefragt. Bei Erkennen
' eines Tastendrucks wird die entsprechende Taste fuer
' 1 sec. auf dem Bildschirm angezeigt.
'
' (c) Thomas Antoni, 24.6.2003
'********************************************************
CLS
PRINT "--------- Druecke eine der folgenden Tasten";
PRINT " (Ende mit Esc)----------"
PRINT "Shift-l | Shift-r | Strg | Alt | Rollen |";
PRINT " Num| ShiftLock | Einfuegen"
'
'***** Benutzerdefinierte Tasten definieren
KEY 15, CHR$(0) + CHR$(42) 'Shift-links-Taste
' Tastennummer 15 (willkürlich gewaehlt)
' Scan-Code 54(Aus der Online-Hilfe zu On KEY)
ON KEY(15) GOSUB shiftlinks 'Behandlungsroutine
KEY(15) ON 'Tastenverfolgung aktivieren
'
KEY 16, CHR$(0) + CHR$(54) 'Shift-Rechts-Taste
ON KEY(16) GOSUB shiftrechts
KEY(16) ON
'
KEY 17, CHR$(0) + CHR$(29) 'Strg-Taste
ON KEY(17) GOSUB strg
KEY(17) ON
'
KEY 18, CHR$(0) + CHR$(56) 'Alt-Taste
ON KEY(18) GOSUB alt
KEY(18) ON
'
KEY 19, CHR$(0) + CHR$(70) 'Rollen-Feststelltaste
ON KEY(19) GOSUB roll
KEY(19) ON
'
KEY 20, CHR$(0) + CHR$(69) 'Num-Feststelltaste
ON KEY(20) GOSUB num
KEY(20) ON'
'
KEY 21, CHR$(0) + CHR$(58) 'Shift-Feststelltaste
ON KEY(21) GOSUB shiftlock
KEY(21) ON'
'
KEY 22, CHR$(0) + CHR$(82) 'Einfuegen
ON KEY(22) GOSUB einfuegen
KEY(22) ON
'
'**** Hauptprogramm, Anzeigen loeschen
'**** wird von den Behandlungsroutinen
'**** unterbrochen
DO
FOR i% = 4 TO 11 '8 Ausgabe-Zeilen
LOCATE i%, 1
PRINT SPACE$(25) 'loeschen (mit Blanks ueberschreiben)
NEXT i%
LOOP WHILE INKEY$ <> CHR$(27) 'Beenden mit Esc
END
'
'*** Behandlungsroutinen, werden jeweils
'*** bei Tastendruck angesprumgen
shiftlinks:
LOCATE 4, 1
PRINT "Shift-links"
SLEEP 1 'fuer 1 sec anzeigen
RETURN
'
shiftrechts:
LOCATE 5, 1
PRINT "Shift-rechts"
SLEEP 1
RETURN
'
strg:
LOCATE 6, 1
PRINT "Strg-Taste"
SLEEP 1
RETURN
'
alt:
LOCATE 7, 1
PRINT "Alt-Taste"
SLEEP 1
RETURN
'
roll:
LOCATE 8, 1
PRINT "Rollen-Feststelltaste"
SLEEP 1
RETURN
'
num:
LOCATE 9, 1
PRINT "Num-Feststelltaste"
SLEEP 1
RETURN
'
shiftlock:
LOCATE 10, 1
PRINT "Shift-Feststelltaste"
SLEEP 1
RETURN
'
einfuegen:
LOCATE 11, 1
PRINT "Einfuegen-Taste"
SLEEP 1
RETURN
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online
unter www.antonis.de/faq/progs/keystat2.bas .
*** Wozu sind die Rollen-Taste und die Rollen-LED gut?
Die wenigsten PC-Anwender wissen, wozu eigentlich die mit "Rollen"
beschriftete Taste und Leuchtdiode gut sind. Sinn der ScrollLock-Funktion ist,
dass beim Rollen von Bildschirminhalten über die Pfeiltasten der Cursor nicht
mitrollt, sondern die Cursor- Position unverändert bleibt.
Diese Funktion wurde früher in alten DOS-Programmen häufig verwendet. Auch
heute ist sie noch vereinzelt anzutreffen, z.B. in MS Excel.
Answer 2
~~~~~~~~~~~~~~~~~~~~~~~
[ By Don Schullian ]
The follwing Programm displays the status of the special Keys on the
screen.
'************************************************************************
' SPECKEYS.BAS - Status Display of <CTRL>, <ALT>, <SHIFT>,
<NUMLOCK> etc.
' ============
' The <CTRL>, <ALT>, <SHIFT>, <NUMLOCK>, etc keys are
all reported in
' 2 bytes and unless you're worried about right & left you'll only
need
' one byte.
' You need to test the individual bits to see which of the keys are
' depressed or in an ON state.
'
' (c) Don Schullian & Thomas Antoni Oct 21, 1998 - June 24, 2003
'************************************************************************
DO
DEF SEG = 0
K% = PEEK(&H417)
PRINT K%
DEF SEG
LOOP
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online
unter www.antonis.de/faq/progs/speckeys.bas .
Use the appropriate Bit of the keyboard status byte 00:417 to scan the
individual key:
- Bit 2^0 = Shift right
- Bit 2^1 = Shift left
- Bit 2^3 = Strg
- Bit 2^4 = Alt / Alt Gr
- Bit 2^5 = Scroll Lock
- Bit 2^6 = CapsLock
- Bit 2^7 = Insert
Antwort 3
~~~~~~~~~~~~~
[ von Andreas Meile im QB-Forum, 19.4.2004 ]
Du kannst den Status der LEDs "Num", "Caps" (Shift Lock) und "Rollen" sehr
einfach und elegant über das BIOS mit CALL INTERRUPT abfragen. Der folgende
Code-Schnipsel zeigt, wie das geht:
' $INCLUDE: 'qb.bi'
DIM dosIntEin as RegTypeX, dosIntAus as RegTypeX
dosIntEin.ax = &H200
CALL INTERRUPTX(&H16, dosIntEin, dosIntAus)
IF dosIntAus.ax AND 16 THEN
PRINT "Scroll-Lock aktiviert"
ELSE
PRINT "Scroll-Lock nicht aktiviert"
END IF
IF dosIntAus.ax AND 32 THEN
PRINT "Num-Lock aktiviert"
ELSE
PRINT "Num-Lock nicht aktiviert"
END IF
IF dosIntAus.ax AND 64 THEN
PRINT "Caps-Lock aktiviert"
ELSE
PRINT "Caps-Lock nicht aktiviert"
END IF
Wegen des CALL INTERRUPT-Befehls ist dieses Programm nur unter QuickBASIC,
nicht unter QBasic ablauffähig. QuickBASIC 4.5 muss mit "QB /L" aufgerufen
werden.
Weiterführende Informationen dazu gibt s auf meiner "Heimseite"
unter
http://dreael.catty.ch/Deutsch/BASIC-Knowhow-Ecke/DOS-Interrupts.html
Antwort 4
~~~~~~~~~~~~~
[ von East-Power-Soft ( www.east-power-soft.de ) im QB-Forum,
24.7.2002 - 21.4.2004]
Der CHR$() für TAB ist CHR$(09h); für Shift+TAB CHR$(00h)+CHR$(0Fh). Generell
kann man den Status der ALT, Shift und STRG-Tasten aber besser über einen
PEEK-Befehl abfragen. Dieses Byte gibt dann den Status der Tasten als gesetzte
bzw. nicht gesetzte Bits wieder. Dieses Byte auslesen geht folgendermassen:
DEF SEG = &H40
BYTE = PEEK(&H17): '---> Byte auslesen
DEF SEG
Und die einzelnen Bits im Tastatur-Statusbyte repräsentieren
folgendes:
'---> Bit0 = Rechte Shift (1)
'---> Bit1 = Linke Shift (2)
'---> Bit2 = Strg (4)
'---> Bit3 = Alt (8)
'---> Bit4 = Rollen (16)
'---> Bit5 = Num-Lock (32)
'---> Bit6 = Caps-Lock (64)
'---> Bit7 = Einfügen (128)
Mein folgendes Programm fragt mit dieser Methode den Status der LEDs "Num",
"Caps" (Shift Lock) und "Rollen" ab:
'****************************************************************************
' TASTSTAT.BAS = ' TASTSTAT.BAS = Tastaturstatus fuer Strg,Alt,Shift,Num
usw.abfragen/aendern
' ============
' Dieses Q8uick)Basic-Programm demonstriert, wie man den Status der
Sonder-
' tasten abfragen und aendern kann. Die Status-LEDs "Num", "ShiftLock"
und
' "Rollen" auf der Tastatur werden zum Blibken gebracht.
'
' (c) 23/02/2003 by East-Power-Soft
'
' Tipp 7: Abfrage und Aendern des Tastaturstatus.
'============================================================================
'
'============================================================================
' Bitverteilung im Tastaturstatusbyte.
'============================================================================
'
'---> Bit0 = Rechte Shift (1)
'---> Bit1 = Linke Shift (2)
'---> Bit2 = Strg (4)
'---> Bit3 = Alt (8)
'---> Bit4 = Rollen (16)
'---> Bit5 = Num-Lock (32)
'---> Bit6 = Caps-Lock (64)
'---> Bit7 = Einfügen (128)
'
'****************************************************************************
'
DEF SEG = &H40
ORG = PEEK(&H17): '---> Anfangsstatus merken
DEF SEG
'
'============================================================================
' Beispiel
'============================================================================
CLS
PRINT "Manchmal ist es notwendig, oder wuenschenswert, den Status der"
PRINT "Tastatur abzufragen oder zu aendern. Um dies zu erreichen muss"
PRINT "man lediglich das Tastaturstatusregister mit PEEK(&H17) im
Segment"
PRINT "&H40 abfragen bzw. neu beschreiben"
PRINT
PRINT "Wenn Du jetzt auf Deine Tastatur siehst, sollten die LED's"
PRINT "fuer Num-Lock, Caps-Lock und Rollen blinken. So wie die Lampen"
PRINT "blinken, aendert sich auch deren Status. Anders laesst sich
dieses"
PRINT "Beispiel leider nicht erklaeren."
PRINT
PRINT "Hier hilft nur ausprobieren. ";
COLOR 14: PRINT "Ende mit RETURN."
'
DEF SEG = &H40
'
DO
FOR P = 0 TO 80000: NEXT
POKE &H17, 16 + 32 + 64 '---> Hier wird der neue Status gesetzt
A$ = INKEY$ '---> damit er wirksam wird, muá die Tastatur
IF A$ = "" THEN '---> einmal abgefragt werden.
FOR P = 0 TO 80000: NEXT
POKE &H17, 0
A$ = INKEY$
ELSE
EXIT DO
END IF
LOOP
'
POKE &H17, ORG AND NOT (15) '---> Anfangswert wiederherstellen
DEF SEG '---> aber die Bit's 0-3 ausschalten
A$ = INKEY$
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online
unter www.antonis.de/faq/progs/taststat.bas .
Answer 5
~~~~~~~~~~~~~~~
[ Tip by Ingmar Neuwirth ]
You know the problem, that you can't handle the ALT or CTRL keys with QBasic.
Now here is a solution for all, who want access these special keys.
CLS
DEF SEG = &H40
'
WHILE INKEY$ <> CHR$(27)
first% = PEEK(&H17) 'read first statusbyte on offsetadress hex 17
second% = PEEK(&H18) 'and second on offset hex 18
PRINT "First statusbyte: "; first%, "Second statusbyte: "; second%
WEND
'
DEF SEG 'restore QBasic datasegment
Don't quite understand this? Email the author Ingmar Neuwirth.
Antwort 6
~~~~~~~~~~~~~~~~
[ von Jodiho ( djoder*web.de
S ) und ShadowTurtle ( shadowturtle*vype.de - www.shadowturtle.de/ ) im QB-Forum,
9.11.2002 ]
*** Problem
Wie Frage ich die Alt-Taste ab?
*** Lösung
Das geht mit einer Direktabfrage des Tastaturpuffers über INP(&H60) gemäß
dem folgenden Rezept:
Taste% = inp(&H60)
if Taste% = 56 then call test
56 ist der sogenannte Scancode der Alt-Taste. Achtung: Diese Methode ist viel
schneller als INKEY$ und INPUT, kann aber nicht zwischen Groß- und
Kleinschreibung unterscheiden und leert nicht den Tasaturpuffer, der daher nach
16 Tastenbetaetigungen überlüft. INP(&H60) ist aber sonst für Spiele sehr
geeignet.
Wenn Du noch mehr Tasten-Scancodes wissen willst, dann schau in der QB-Hilfe
unter "Inhalt -> Tastatur-Abfragecodes" .
Hier ein kleines Tool das jeder QBasic Programmierer haben sollte um zu
überprüfen welche rückgabe wert eine Taste hat:
CLS
PRINT "Tastatur-Scancode-Scanner *g*"
PRINT "Bitte drücke eine Taste und dir wird dann der Scancode"
PRINT "dieser Taste angezeigt die Du in der IF-Aanweisung"
PRINT "eingeben musst, um diese abzufragen"
PRINT
PRINT "ACHTUNG: Nach 16 Tastenbetaetigungen laeuft der"
PRINT "Tastaturpuffer ueber!!!"
DO
Taste% = INP(&H60)
IF Taste% THEN PRINT Taste%
LOOP UNTIL Taste% = 1 'Beenden mit Esc (Scan-Code 1)
Antwort 7
~~~~~~~~~~~~~
[ im QB-Forum, 26.10.2002 ]
*** Frage: Wie kann ich die Num-Lock Taste
aus-/einschalten?
*** Antwort:
' ausschalten
DEF SEG = 0
POKE &H417, PEEK(&H417) AND 223
'........
' einschalten
DEF SEG = 0
POKE &H417, PEEK(&H417) OR 32
Antwort 8
~~~~~~~~~~~~~
[ von Tailor ( www.tailorweb.de - gmtailor*freenet.de ) im QB-Forum, 2.7.2002 ]
Du suchst eine Möglichkeit, in QB die Tasten ALT und STRG abzufragen?
Außer den bereits oben genannten Methoden gibt es noch eine weitere
Möglichkeit, Strg & Alt abzufragen, nämlich die Speicherstellen 417h &
418h. Ich persönlich benutze diese Variante lieber als INP(&h60), weil sie
nicht den Code der zuletzt gedrückten oder losgelassenen Taste liefern, sondern
speziell den Zustand von Strg, Alt, Shift, Caps, Pause, Scroll, Insert etc. Über
dieses Proggie kannst Du die genauen Änderungen herausfinden:
CLS
DEF SEG = 0
DO
K$ = INKEY$
LOCATE 1,1
PRINT PEEK(&h417), PEEK(&h418)
LOOP UNTIL K$ = CHR$(27)
DEF SEG
END
Zum Beispiel ist, wenn das erste Bit von Byte 417h gesetzt ist, die rechte
Shift-Taste gedrückt:
DO
IF (PEEK(&h417) AND 1) = 1 THEN
PRINT "Rechte Shift-Taste gedrückt"
END IF
LOOP UNTIL K$ = CHR$(27)
END
Answer 8
~~~~~~~~~~~~~
[ from the QB-Forum at www.network54.com/Forum/ ]
*** Question
How do you read control keys such as SHIFT?
*** Answer
The shift states of the keyboard are at 40h:17h in memory, so in order to
read those you'd have to read a byte from there, which is in the following
format:
7|6|5|4|3|2|1|0
| | | | | | | + Right Shift
| | | | | | +-- Left Shift
| | | | | +---- CTRL
| | | | +------ ALT
| | | +-------- Scroll-Lock
| | +---------- Num-Lock
| +------------ Caps-Lock
+-------------- Insert
So you'd set a group of constants like this:
CONST RShift = &H1
CONST LShift = &H2
CONST Ctrl = &H4
CONST Alt = &H8
CONST Scroll = &H10
CONST NumLock = &H20
CONST CapsLck = &H40
CONST Insert = &H80
Okay, now you read the byte from memory, like:
DEF SEG = &H40
LET ShiftStates = PEEK(&H17)
DEF SEG
And to test which key(s) is(are) depressed, do this:
IF (ShiftStates AND Alt) THEN Blah...
or even:
IF (ShiftStates AND (LShift OR Ctrl) THEN Blah...
[ The QBasic-MonsterFAQ --- Start Page: www.antonis.de/faq ]