Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Tastendruck simulieren

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Leader4



Anmeldungsdatum: 20.01.2005
Beiträge: 99
Wohnort: Leipzig

BeitragVerfasst am: 14.03.2005, 17:02    Titel: Tastendruck simulieren Antworten mit Zitat

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)? grinsen happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 14.03.2005, 18:22    Titel: Antworten mit Zitat

Keine Ahnung, vielleicht, da mit
Code:

k=INP(96)

der Tastaturpuffer ausgelesen wird, könnte man vielleicht mit
einem Code a la
Code:

OUT 96, Daten

oder
Code:

POKE 96, Daten

einen Tastendruck simulieren.

Wahrscheinlich muss vorher noch mit DEF SEG rumgemurkst werden.
Wie gesagt, nur ein Ansatz.

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 14.03.2005, 18:47    Titel: Antworten mit Zitat

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 zwinkern )


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
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 14.03.2005, 19:06    Titel: Antworten mit Zitat

Ä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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 14.03.2005, 19:31    Titel: Antworten mit Zitat

Oops verlegen , 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
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 14.03.2005, 20:01    Titel: Antworten mit Zitat

Jo, war gut, aber im BIOS-Segment sollte man lieber nicht rumpfuschen,
daher ist das für mich erst mal noch "Sperrgebiet"....... zwinkern
(Mein Vater wird mir was erzählen, wenn ich seinen PC lahmlege lachen )

EDIT:
Code:

'Adresse ermitteln, an die geschrieben werden muss.
PEEK &H001C, Adresse

geht aber auch nicht...

Nimm doch ganz simpel

Code:

Adresse = PEEK(&H001C)

durchgeknallt

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 14.03.2005, 20:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 14.03.2005, 21:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 14.03.2005, 22:54    Titel: Antworten mit Zitat

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 zwinkern
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 15.03.2005, 16:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 15.03.2005, 18:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 15.03.2005, 19:43    Titel: Antworten mit Zitat

Dusky_Joe hat Folgendes geschrieben:

Viel Spaß und Kopfweh!
(du wist beides sicher haben *g*)


Oh, vielen Dank zwinkern zwinkern

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz