 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Grey Fox
Anmeldungsdatum: 16.02.2005 Beiträge: 13
|
Verfasst am: 16.03.2005, 08:36 Titel: Tastatur Status LED umsetzen |
|
|
Also folgendes...
Mit &H97 kann ich ja intern den Status der Lock's abfragen und umsetzen.
Jedoch bleiben die LED's bei diesen Vorgang so wie sie sind (Is ja anscheinend nur intern).
Man muss doch aber irgend wie den LED Status umsetzen können macht er ja beim Booten auch.
Oder hab ich die Falsche Adresse???
THX schon mal im vorraus! |
|
Nach oben |
|
 |
Xolios aka Ray

Anmeldungsdatum: 07.12.2004 Beiträge: 589 Wohnort: Wildeshausen
|
Verfasst am: 16.03.2005, 09:53 Titel: ... |
|
|
Hallo.
Ich meine es gab ein Beispiel
im QBMONFAQ
Aber ich kann es gerade nicht finden...
Gruß
Ray _________________ www.ray-earth.de
Anm.: Neue ICQ |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
Grey Fox
Anmeldungsdatum: 16.02.2005 Beiträge: 13
|
Verfasst am: 16.03.2005, 16:25 Titel: |
|
|
Jo THX an Sebastian & Ray
So was hab ich gesucht! |
|
Nach oben |
|
 |
Thomas Antoni

Anmeldungsdatum: 12.10.2004 Beiträge: 220 Wohnort: Erlangen
|
Verfasst am: 16.03.2005, 16:52 Titel: Dazu habe ich mir Folgendes für die QB-MonsterFAQ vorgemerkt |
|
|
Dazu habe ich mir Folgendes für die QB-MonsterFAQ vorgemerkt
--------------------------------------------------------------------------------
Frage:
--------
Wie verändere den Status der Sondertasten NumLock usw.?
*** Hinweis von A.K.
-AK-: man muß bei meinem Prog einfach nur den INT16 AH=1 nach jedem Poke aufrufen
und schon funktionierts
webmaster@iconsoft.de kann für FAQ genommen werden.
Antwort 1
-----------
[ von A,K, und Thomas Antoni, 23.6.2003 - 25.5.2003 ]
Wie im Eintrag -> "Wie frage ich die Sondertasten Shift, Num usw. ab?"
beschrieben, kannst Du das Tastatur-Statusbyte 417 hex wie folgt abfragen,
um den Status der Sondertasten ermitteln:
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.
Wie sage ich der Tastatur welchen Status sie annehmen sollen? Das geht
mit folgender Befehlssequenz:
DEF SEG = &H40
POKE (&H17),status%
DEF SEG
Werte für status%:
- 1 Shift rechts
- 2 Shift links
- 4 Strg
- 8 Alt / Alt Gr
- 16 ScollLock (Rollen-Feststelltaste)
- 32 NumLock (Num-Feststellstaste)
- 64 CapsLock (Shift-Feststelltaste)
- 128 Einfügen
Bei mehreren Tasten addiert man die Werte einfach.
Das geschilderte Verfahren funktioniert leider nur unter reinem DOS und in der
DOS-Box von Windows 3.1/95/98/Me. Unter den NT-basierten Windows - Varianten
Windows NT/2000/XP werden derartige Hardware-Zugriffe leider abgeblockt.status%
bestimmt den Status der Sondertasten.
Hier noch ein Beispielprogramm, das die NUM-LED blinken lässt.
'*******************************************************
' KeyLites.bas = Num-LED an der Tastatur blinken lassen
' ============
'
' (c) A.K., 23.6.2003
'*******************************************************
DEF SEG = &H40
DO
POKE (&H17), 0
SLEEP 1
POKE (&H17), 32
SLEEP 1
LOOP UNTIL INKEY$ = CHR$(27) 'Abbruch mit Esc
DEF SEG
(( KeyLites.bas bereits in Progs/neu/ ))
Dieses Programm funktioniert nur unter DOS und Win 3.1/ 95/ 98/ Me und leider
nicht unter Win NT/2000/XP. Vermutlich blocken diese Betriebssysteme den Zugriff
auf Hardware- und BIOS-Adressen viel restriktiver ab.
Kenn jemand einen Weg, die Tastatur-LEDs bei NT/XP anzusteuern?
Beim Zugriff auf serielle und parallele Ports gibt es meines Wissens dieselben
Probleme.
*** Anmerkungen von A.K. 4.7.2003 dazu:
jetzt weiß ich auch warum das nur geht, wenn man gleichzeitig eine Taste
gedrückt hält:
Und zwar habe ich das bei meinem Programm so gemacht das nach jedem
schreiben der INT16/AH=1 aufgerufen wird. Und der bewirkt ja nur das
man schaut ob eine Taste gedrückt wurde.
Das gleiche funktioniert auch mit INKEY$, weil dieser Befehl ja auch
diesen INT16 benutzt.
Damit der Status nämlich auf die Tastatur "geschrieben" wird muß man
nach dem POKE mindestens einmal versuchen ein Zeichen zu lesen.
Und bei meinem allerersten Programm das Du hast und nicht funktioniert
liest er zwar die Taste mit INKEY$ aber immer nach dem 0-Status
setzen. Und deswegen hat da nichts geblinkt.
Und bei dem Prog SISCILIT.BAS, das Du hier gepostet hast liest er ja nach jedem
eintragen eine Taste und deswegen funzt das auch.
Darauf muß man erstmal kommen! :-)
***
Da gibt es eine Funktion in Nibbles zum Rücksetzen und restaurieren
der xxxLock-Keys
***
Weitere Infos auch in Douggie's Programm KEYINFO.BAS in QB-Monfaq_2.txt
***
Siehe auch den obenstehenden Beitrag mit dem Programm von Don Schullian
***
Das folgende Programm aus den Newsgroups funktioniert nicht unter Win.NT4
(unter Win.95 testen):
DEF SEG = 0
POKE &H417, PEEK(&H417) OR 32 'numlock on
SLEEP
Answer 2
----------
[ PowerBasic-Programm aus dem ABC-Archiv ]
'===========================================================================
' Subject: NUMLOCK TOGGLE IN PB Date: 01-19-96 (13:55)
' Author: Rolf Genster Code: PB
' Origin: Rolf@ice.prima.ruhr.de Packet: KEYBOARD.ABC
'===========================================================================
$if 0
=========================================================================
Small code for switching NUMLOCK on and off
written in PowerBasic 3.20
by Rolf Genster on 01/19/96
Bit 6 : Caps Lock
Bit 5 : Num Lock 1 = active, 0 = off
Bit 4 : Scroll Lock
Code for MS-Basics would look like:
POKE &H417, PEEK(&H417) OR 32 'NUM-Lock on
or
POKE &H417, PEEK(&H417) AND NOT 32 'NUM-Lock off
=========================================================================
$endif
$lib all off
$optimize speed
$error all off
$cpu 80386
defint a-z
a$=lcase$(command$)
print
def seg = 0
if instr(a$,"on") > 0 then
X = PEEK(&H417)
BIT SET X, 5 ' turn on NUM-Lock
POKE &H417, X
print "Numlock set!"
elseif instr(a$,"off") > 0 then
X = PEEK( &H417 )
BIT RESET X, 5 ' turn off NUM-Lock
POKE &H417, X
print "Numlock reset!"
else
X = PEEK( &H417 )
BIT TOGGLE X, 5 ' toggle NUM-Lock
POKE &H417, X
print "Numlock toggled!"
end if
def seg
print
end
--------------------------------------------------------------------------------
Frage:
--------
Wie schalte ich die LEDs an der Tastatur Ein/Aus?
Antwort 1
----------
[ von Thomas Antoni unter Verwendung eines Programmvorschlags von
http://hem.passagen.se/einarb/qbasic.htm#twinkle , 23.6.2003 ]
Wie man den Zustand der Feststelltasten für "Num", "Shift" und "Rollen"
beeinflussen kann, ist schon im Detail im Eintrag -> "Wie verändere den Status
der Sondertasten NumLock usw.?" abgehandelt worden.
Nun wollen wir damit ein wenig spielen und die dazugehörigen LEDs auf der Tastatur
zum Leuchten bringen.
Das folgende Programm DISCOLIT.BAS lässt die drei LEDs NumLock, ShiftLock und
ScrollLock in Form einer netten Disco-Beleuchtung blinken.
Das funktioniert leider nur unter DOS und Windows 3.1/95/98/Me und nicht unter
den NT-basierten Betriebssystemen Windows NT, 2000 und XP. Auch bei Tastaturen,
die über den USP-Port angeschlossen sind, wird es wohl nicht funktionieren.
'*************************************************
' DISCOLIT.BAS = Lichtorgel mit den Tastatur-LEDs
' ============
' (c) http://hem.passagen.se/einarb/
'*************************************************
DEF SEG = 0
s% = PEEK(&H417)
POKE &H417, &HC0
'B = 3000
WHILE INKEY$ = ""
POKE &H417, (PEEK(&H417) XOR &HF0)
' FOR a = 1 TO B: NEXT a
starttime! = TIMER
DO: LOOP UNTIL TIMER > starttime! + .1
WEND
POKE &H417, s%
(( DISCOLIT.BAS bereits in qbmonfaq/progs/neu/
B=3000 und FOR... noch löschen! ))
Antwort 2
------------
[ von Sebastian Steiner (sebastian_steiner@gmx.de) im QB-Forum, 18.12.2004 ]
Das geht nach folgendem Schema:
DEF SEG = &H40
POKE &H17, PEEK(&H17) AND 223
POKE &H17, PEEK(&H17) AND 171
POKE &H17, PEEK(&H17) AND 275
DEF SEG
DEF SEG = 0
Status% = PEEK(&H417)
POKE &H417, (Status% XOR &H10) 'Scroll Lock
SLEEP
POKE &H417, (Status% XOR &H40) 'Caps Lock
SLEEP
POKE &H417, (Status% XOR &H20) 'Num Lock
Wenn du nur Scroll Lock leuchten lassen willst, lass die Befehle,
in denen als Kommentar Caps Lock und Num Lock hintersteht, einfach weg.
Answer 3
----------
[ von http://hem.passagen.se/einarb/qbasic.htm#twinkle , 23.6.2003 ]
Code to make the Numlock Capslock Scrolllock twinkle... Back to top
DEF SEG = 0
s% = PEEK(&H417)
POKE &H417, &HC0
B = 3000
WHILE INKEY$ = ""
POKE &H417, (PEEK(&H417) XOR &HF0)
FOR a = 1 TO B: NEXT a
WEND
POKE &H417, s%
Answer 4
----------
[ by Michael Hansen ( www.mghansen.de/dosstuff/keyctlhowto.html ) , 23.6.2003 ]
Keyboard lamps
Accessing the keyboard lights is quite easy: You don't even have to talk to the
keyboard, you just have to manipulate some bits in memory. I have written a
program that can do it for you, go here if you're interested!
The BIOS (=Basic Input/Output System) controls the keyboard. It uses a special
part of the memory to store its data - that's in the segment 0040h. And among
these so-called BIOS-variables you can also find one where the BIOS stores which
lamps are on. This variable is at the address 0040h:0017h and has the size of
one byte. Each of its bits corresponds to a keyboard-state:
bit hex-value meaning
0 01h right shift-key pressed
1 02h left shift-key pressed
2 04h ctrl-key pressed
3 08h alt-key pressed
4 10h ScrollLock active
5 20h NumLock active
6 40h CapsLock active
7 80h Insert active
All your program needs to do is to change these bits and the BIOS will tell the
keyboard to change its status. It usually updates the keyboard-status each time
one of its keyboard-functions is called. That is usually done whenever a program
wants to see if the user pressed a key. So if you just want to turn on NumLock
each time you start your PC, you don't need to call a BIOS-function because it
will get called soon enough. But you should call that function if you are
planning to make a program that lets the lights walk.
So how do I manipulate thay variable, you might ask? Well, that depends on your
programming language. I have made a sample-program in C, Turbo Pascal, Basic and
Assembler. If you have MS-DOS on your PC, you can start the qbasic-program to
test the Basic-program (start qbasic.exe from the DOS-directory). Have a look at
the program-listings to see how it works... but let me explain now how to
manipulate the bits once you've got access to the variable: To turn a bit on,
you just have to do an OR-operation with its value. To turn a bit off, you have
to do an AND-operation with the opposite of the value: Do a NOT-operation on the
bit's value and then do the AND-operation!
I haven't gotten around to put the BIOS-function into the listings yet, so just
try calling one of your programming-language's input-functions instead, because
it should call the BIOS.
--------------------------------------------------------------------------------
Before trying any of the listings, you should read the legal information! If you
have any questions, ask, because manipulating memory in a wrong way might crash
our computer!
--------------------------------------------------------------------------------
Listing in Basic:
'THIS IS EXTREMELY IMPORTANT! YOU SHOULD DO THIS EVERY TIME YOU USE
'PEEK AND POKE, OTHERWISE YOU MAY EASILY CRASH YOUR SYSTEM!
'set segment:
DEF SEG = &H40
'now turn on NumLock:
DEF SEG = &H40
POKE &H17, (PEEK(&H17) OR &H20)
'and turn it back off:
DEF SEG = &H40
POKE &H17, (PEEK(&H17) AND NOT &H20)
'now turn on CapsLock:
DEF SEG = &H40
POKE &H17, (PEEK(&H17) OR &H40)
'and turn it back off:
DEF SEG = &H40
POKE &H17, (PEEK(&H17) AND NOT &H40)
'now turn on ScrollLock:
DEF SEG = &H40
POKE &H17, (PEEK(&H17) OR &H10)
'and turn it back off:
DEF SEG = &H40
POKE &H17, (PEEK(&H17) AND NOT &H10)
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Frage:
--------
Wie frage ich die Sondertasten Shift, Num usw. ab?
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:
1) Direkt-Abfrage des Statusbytes 00:417 (Hex) im BIOS-Datenbereich
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.2993
'************************************************************************
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
(( KEYSTAT.BAS bereits in qbmonfaq/progs/neu/ ))
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 ist die Sondertastenabfrage mit ON KEY wie folgt
beschrrieben:
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
(( KEYSTAT2.BAS bereits in progs/neu/ ))
*** 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
(( SPECKEYS.BAS bereits in qbmonfaq/progs/neu/ ))
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://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/DOS-Interrupts.html
Antwort 4
~~~~~~~~~~~~~
[ von East-Power-Soft (www.east-power-soft.de) im QB-Forum, 21.4.2004]
Du kannst den Status der LEDs "Num", "Caps" (Shift Lock) und "Rollen" wie folgt
abfragen:
'============================================================================
' (p)'23/02/2003 by East-Power-Soft
'
' Tipp 7: Abfrage und Ändern 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 wünschenswert, den Status der Tastatur zu"
PRINT "erfahren oder zu ändern. Um dies zu erreichen muß man lediglich das"
PRINT "Tastaturstatusregister, PEEK(&H17) im Segment &H40, abfragen bzw. neu"
PRINT "beschreiben. Wenn Du jetzt auf Deine Tastatur siehst, sollten die LED's"
PRINT "für Num-Lock, Caps-Lock und Rollen blinken. So wie die Lampen blinken, ändert"
PRINT "sich auch deren Status. Anderst läßt sich dieses Beispiel leider nicht erklären."
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$ _________________ +++ Die beliebte QBasic CD-ROM von QBasic.de - 670 MB QBasic-Stuff mit komfortabler HTML-Oberfläche. Für nur 5 EUR bestellbar auf www.antonis.de/qbcdueb.htm +++ |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 16.03.2005, 16:59 Titel: |
|
|
Thomas Antoni hat Folgendes geschrieben: |
Dazu habe ich mir Folgendes für die QB-MonsterFAQ vorgemerkt
|
Wann kommt denn endlich ne neue Version der FAQ, bin schon ganz
wild drauf
jb |
|
Nach oben |
|
 |
Grey Fox
Anmeldungsdatum: 16.02.2005 Beiträge: 13
|
Verfasst am: 17.03.2005, 14:50 Titel: |
|
|
Naja ich denke mal das ich einfach nur bei &H497 Nur den Status Abgefragt hab und bei &H417 einfach nur vergessen hab das 1 Byte nicht aus nur 4 Bit besteht
Geht aber wunderbar!!!
Nochmal THX
Was mich mal noch interessieren würde meine Tastatur besitzt aber 4 LED's die Vierte Aktiviert die Sondertasten wenn ich die kann sich ja dann logischerweise nicht mehr in &H417 befinden (Ist ja schon belegt)
Wo würde ich die am ehesten finden???
Gibt es vielleicht einen "Freien Adressraum" der Softwaremäßig belegt werden kann??? |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|