 |
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 |
Leader4
Anmeldungsdatum: 20.01.2005 Beiträge: 99 Wohnort: Leipzig
|
Verfasst am: 14.03.2005, 17:02 Titel: Tastendruck simulieren |
|
|
Moin Kollegen.
Kann man in QBasic (Compiler V 4.5) einen Tastendruck simulieren, zum Beispiel dass ich ein Programm so programmieren kann, dass es zu Windows zurückspringt, ohne dass man Alt + Tab drücken muss oder dass das Programm "denkt", es würde die Taste A gedrückt werden, ohne dass sie gedrückt wurde? Geht so etwas vielleicht, wenn nicht in QBasic, so doch zumindest vielleicht im Disk Operating System (DOS)?  |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 14.03.2005, 18:22 Titel: |
|
|
Keine Ahnung, vielleicht, da mit
der Tastaturpuffer ausgelesen wird, könnte man vielleicht mit
einem Code a la
oder
einen Tastendruck simulieren.
Wahrscheinlich muss vorher noch mit DEF SEG rumgemurkst werden.
Wie gesagt, nur ein Ansatz.
jb |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 14.03.2005, 18:47 Titel: |
|
|
Das ist sicher möglich. Das Drücken von ALT-TAB ist ein bisschen schwieriger, deswegen fang ich mal mit einfachen Buchstaben an:
Du schreibst sie einfach direkt in den Tastaturpuffer. Das geht mit DEF SEG und POKE:
Code: |
'Variablen deklarieren:
DIM ASCII AS INTEGER
DIM Adresse AS LONG
'ASCII-Wert von A ermitteln.
'Kann auch jeder beliebige andere Buchstabe sein.
ASCII = ASC("A")
'Das BIOS-Seg, in dem auch der Tastaturpuffer ist
DEF SEG = &H0040
'Adresse ermitteln, an die geschrieben werden muss.
Adresse = PEEK(&H001C)
'Zeichen schreiben:
POKE Adresse, ASCII
|
Siehe dazu auch die QBMonFAQ.
ALT-TAB zu simulieren geht etwas anders, da STRG, ALT, PAUSE, ... nicht in den Tastaturpuffer geladen werden.
Sie werden vom System aber sehr wohl wahrgenommen, und nicht erst zusammen mit anderen Tasten geschrieben.
Wenn eine dieser Tasten gedrückt wird, wird sie an die Adressen &H0096/7 geschrieben.
( Auszug aus der QBMonFAQ: )
Code: |
0096 1 Byte Tastenfeldstatus 3 (nur AT):
Bit 0: Pause-Modus aktiv
Bit 2: rechte Strg-Taste betätigt
Bit 3: rechte Alt-Taste betätigt
Bit 4: Keyboard mit 101/102 Tasten?
0097 1 Byte Status Tastenfeld-LED (nur AT):
Bit 0: Scoll-Lock-LED
Bit 1: Num-Lock-LED
Bit 2: Caps-Lock-LED
|
Wie du siehst, ist an dieser Adresse nur ALT erwähnt. Wir müssen also TAB über den oben genannten "Trick" dazuschreiben:
Code: |
DIM ASCII AS INTEGER
DIM Adresse AS LONG
DIM StatusAlt AS INTEGEr
'Tab hat den ASCII-Wert 9
ASCII = 9
DEF SEG = &H0040
Adresse =PEEK(&H001C)
POKE Adresse, ASCII
Alten Tastaturstatus ermitteln
PEEK &H0096, StatusAlt
'Den Status mit gesetztem 3. Bit schreiben
POKE &H0096, StatusAlt OR 8
|
Theorethisch sollte das funktionieren. Ich habe aber nichts davon getestet, es kann also sein, dass gar nix geht...
Auf jeden fall ist es ungefährlich, was man nicht über alle Zugriffe auf das BIOS-Segment sagen kann.
Deswegen ist es wichtig, dass du nie die &H's vor den Adressangaben vergisst.
(Gefährlich: Ich glaube, das schlimmste was dir passieren könnte, wäre ein Systemabsturz, kaputt wird dir dein PC deswegen wahrscheinlich nicht gehen )
Wo wir gerade dabei sind:
STRG-Unterbrecher hat seine eigene Adresse:
Code: |
DEF SEG=&H0040
POKE &H0071, 128
|
(Das wird dir aber nicht all zu viel nutzen, da in der Interpreter-Phase sofort abbricht, sobald diese Tasten gedrückt sind.
Wenn du ein Programm schreiben willst, in der diese Kombi eine besondere Reaktion hervorrufen soll, musst du es zuerst compilern. Wichtig dabei ist, dass es KEINE Debug-Version sein darf, da sonst wieder sofort beendet wird.
Allerdings kannst du es durchaus dazu verwenden, um an einer ganz bestimmten Stelle eine Pause hervorzurufen. Das kann nützlich sein, wenn die stelle, an der du STRG+Break drücken musst (z.B. beim Debuggen) so kurz ist, dass du sie nicht erwischen würdest.
Beispiel:
Code: |
DEF SEG = &H0040
DO
a = RND * 50
IF a = 3 THEN POKE &H71, 128
' ....
LOOP UNTIL INKEY$=CHR$(27)
|
(Leider auch nicht getestet.) _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Zuletzt bearbeitet von Dusky_Joe am 14.03.2005, 20:27, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 14.03.2005, 19:06 Titel: |
|
|
Ähmmm, warum ermittelst du die Adresse mit
Code: |
'Adresse ermitteln, an die geschrieben werden muss.
POKE &H001C, Adresse
|
Müsste man da nicht was PEEKen????
jb |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 14.03.2005, 19:31 Titel: |
|
|
Oops , stimmt.
=> Geändert.
Aber schön, dass du dir die Zeit nimmst, das durchlesen *g*
Ich hoffe, es war verständlich..?
Ciao _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 14.03.2005, 20:01 Titel: |
|
|
Jo, war gut, aber im BIOS-Segment sollte man lieber nicht rumpfuschen,
daher ist das für mich erst mal noch "Sperrgebiet".......
(Mein Vater wird mir was erzählen, wenn ich seinen PC lahmlege )
EDIT:
Code: |
'Adresse ermitteln, an die geschrieben werden muss.
PEEK &H001C, Adresse
|
geht aber auch nicht...
Nimm doch ganz simpel
Code: |
Adresse = PEEK(&H001C)
|
jb |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 14.03.2005, 20:36 Titel: |
|
|
Was is heut nur los mit mir?
Sicher, am BIOS-Seg rumzupfuschen is nur was für profis. aber der QBMonFAQ kann man trauen (von da sind alle Adressen), und mit zugegriffen hab ich auf alle adressen schon mal. (alle, die eben im code stehen). Es ist auf jeden fall sicher.
Ich habs eben nur ned getestet, ob windows dann auch das fenster wechselt....
denn keyboard-puffer und Reaktion auf Tastenkombi können zwei ganz unterschiedliche dinge sein....
Code: |
DO
AltGedrueckt = PEEK (&H001C) AND 3
IF AltGedrueckt = 1 THEN
....
END IF
LOOP
|
wenn des nach dem Prinzip funzt, dann is überhaupt kein zugriff auf den Puffer, und nix passiert.
aber das schreiben in den Puffer selbst sollte überhaupt kein prob sein, das macht des BIOS (oder der Kernel? k.A.) ganz genau so, bloß eben in der ASM-Version *g*
Code: |
INP AX,60h
MOV BX,0040h
MOV ES,BX
MOV DI,[Adresse]
MOV ES:[DI],AX
|
Oder so.
Und bevor ihr jetz gleich auch noch den ASM-Code verbessert, sag ich lieber gleich, dass ich mir mit dem INP ned sicher bin *g*
Und des [Adresse] stimmt natürlich auch ned, außer wenn irgendwann zuvor Adresse definiert und befüllt wurde.
und beim schreiben in den Puffer wird normal auch noch Adesse um 2 erhöht.
Also
MOV AX, Adresse
ADD AX, 2
MOV Adresse, AX
Wie auch immer.
Ciao _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 14.03.2005, 21:02 Titel: |
|
|
Dusky Joe hat Folgendes geschrieben: |
Und bevor ihr jetz gleich auch noch den ASM-Code verbessert, sag ich lieber gleich, dass ich mir mit dem INP ned sicher bin *g*
|
Hahaha, ASM kann ich aber nicht....
jb |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 14.03.2005, 22:54 Titel: |
|
|
ASM is ganz einfach zu lernen, aber das soll jetz mal egal sein, hier is ja QB-Zone *g*
Hats eigentlich irgendwer schon getestet?
Oder muss ichs tatsächlich selber machen  _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 15.03.2005, 16:27 Titel: |
|
|
Dusky_Joe hat Folgendes geschrieben: |
ASM is ganz einfach zu lernen
|
OK, dann setz ich mich mal ran....
Weißt du, wo ich nen Shareware-Assembler herbekomme????
jb |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 15.03.2005, 18:30 Titel: |
|
|
Google mal nach TASM, da hab ich meinen auch herbekommen. TASM macht ASM-Progs zu OBJ-Files, und die kannst du dann mit TLINK (der is bei QBX dabei, ansonsten googlest du einfach danach *g*) zu EXEs/COMs machen.
Als Tutorial kann ich dir nur "the reals Adoks way to ASM" (auf qbasic.de) empfehlen. Wenn du dann ein bisschen tiefer in der Materie bist, solltest du dir die komplette Referenz anschauen (auf der selben Seite), und evtl downloaden, bzw offline verfügbar machen.
(siehe dazu im Offtopic-Forum: Internetseite komplett downloaden, oder so)
Viel Spaß und Kopfweh!
(du wist beides sicher haben *g*) _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 15.03.2005, 19:43 Titel: |
|
|
Dusky_Joe hat Folgendes geschrieben: |
Viel Spaß und Kopfweh!
(du wist beides sicher haben *g*)
|
Oh, vielen Dank
jb |
|
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.
|
|