Tastendruck Simulieren unter DOS

Teimen

Lt. Junior Grade
Registriert
Jan. 2004
Beiträge
356
Hi,

Ich habe ein Programm das unter DOS läuft. Um eine bestimmte Aktion auszuführen muss ich erst F9 drücken und dann F3 drücken.
Ist das möglich unter DOS den tastendruck so zu simulieren dass ich einfach eine andere Taste auf der Tastur belege und wenn ich die dann drücke simuliert wird dass erst F9 und dann F3 gedrückt wird? Kann man soetwas mit qbasic umsetzen?
 
Mit viel Glück findest du noch entsprechende DOS Keyboard Makro Programme.
Ansonsten solltest du das unter DOS mit etwas Assembler hinbekommen.
INT 16 Funktion 5 sieht da vielversprechend aus.

Einen anderen Ansatz, der direkt den Speicher vom Keyboard Buffer anspricht findest du hier.
 
vb script könnte was für diese Aktion sein. Man erstellt eine Datei, welche beide Tasten über sendkeys anspricht. Diese Datei wird über einen festgelegten Hotkey dann ausgeführt. Das DOS-Fenster muß im Vordergrund für die ganze Aktion sein.

Mögliche Tasten:
Code:
Taste Argument
 
RÜCKTASTE {BACKSPACE}, {BS} oder {BKSP} 
UNTBR {BREAK} 
FESTSTELLTASTE {CAPSLOCK} 
ENTF oder RÜCKSCHRITTTASTE {DELETE} or {DEL} 
NACH-UNTEN-TASTE {DOWN} 
ENDE {END} 
EINGABETASTE {ENTER} or ~ 
ESC {ESC} 
HILFE {HELP} 
POS1 {HOME} 
EINFG {INSERT} or {INS} 
NACH-LINKS-TASTE {LEFT} 
NUM {NUMLOCK} 
BILD-AB {PGDN} 
BILD-AUF {PGUP} 
DRUCK {PRTSC} 
NACH-RECHTS-TASTE {RIGHT} 
ROLLEN {SCROLLLOCK} 
TAB {TAB} 
NACH-OBEN-TASTE {UP} 
F1 {F1} 
F2 {F2} 
F3 {F3} 
F4 {F4} 
F5 {F5} 
F6 {F6} 
F7 {F7} 
F8 {F8} 
F9 {F9} 
F10 {F10} 
F11 {F11} 
F12 {F12} 
F13 {F13} 
F14 {F14} 
F15 {F15} 
F16 {F16}
Pluszeichen             "+"
Zirkumflexzeichen    "^" 
Prozentzeichen        "%"
Tilde                       "~"
UMSCHALTTASTE + 
STRG ^ 
ALT % 
Windowstaste "^{ESC}"
 
Ja, kleine Frage:
ist es ein "echtes" DOS-Programm, oder läuft es auch unter der Kommandozeile in Windows? Da gäbe es nämlich verschiedene Aspekte, wie man rangehen kann.

Für DOS fällt mir dann allerdings nur ein TSR-Programm ein, weil Multitasking ja eigentlich nicht möglich ist.
 
Das ist ein echtes DOS programm. Also es läuft als Virtueller PC unter Windows XP. Ich hab schon ein bisschen geschaut wie man das mit Visual Basic machen könnte das sieht auch vielversprechend aus!
 
@ryan_blackdrago
CMD != DOS !!!
 
Ich hab jetzt unter VBA ein Programm erstellt das beim druck auf den Button nacheinander einen Tastendruck F9 und danach F3 simuliert... Jetzt habe ich nur das Problem wie bekomme ich aus dem ganzen eine exe Datei? Oder geht das in der Kostenlosen expressversion gar nicht dass man exedateien erstellt?
Wegen dem kleinen Programm will ich mir aber keine Vollversion kaufen!
Der Code sieht so aus ich hoff mal ich hab alles richtig gemacht weil ich kanns hier nicht testen:

Public Class Form1


Private Declare Sub Sleep Lib "kernel32" (ByVal dwMS As Long)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
AppActivate("Virtueller PC")
SendKeys.Send("F9")
Sleep(1000)
SendKeys.Send("F3")
End Sub
End Class
 
@ryan_blackdrago
Das war Kurzform für:
Die Command-Shell unter Windows NT x.x hat nichts mit DOS zu tun.
 
Es gibt die vbstoexe.exe http://www.f2ko.de/Deutsch/index.php
CMD starten > vbstoexe.exe deinskript.vbs deinscript.exe

Es wird aber wahrscheinlich nicht funktionieren. Bin von der Kommandozeilen-Umgebung in z.B. WinXP ausgegangen. Mein Gedanke war : Das VB Script wird ausgeführt, während das CMD-Fenster im Vordergrund auf ist. WinXP übergibt dann den emulierten Tastendruck an das offene Fenster (in diesem Fall CMD).

In einer reinen DOS-Umgebung wird's daher nicht funktionieren.
 
Ich probier das heute abend mal aus... Ich bin mir auch nicht sicher ob das Funktioniert mit dem Programm wenns die Tasten dann auf den virtuellen PC simulieren soll. Probieren geht über studieren!
 
Warum nimmst du nicht AutoIt, alles andere ist nur rummurksen, VBScript ist nie für Automatisierung gemacht worden.

Mit AutoIt schreibst nur
Code:
WinActivate("DOS Fenster")
Send("{F9}")
Send("{F3}")
das ganze kannst dann noch mit Hotkey machen
fertig
 
Schön, und was hat das mit dem Topic zu tun? Es geht hier um DOS.
 
ahm, so wie ich das gelesen hab, läuft sein DOS Programm in einer VM auf nem normalen windows xp. dann kann autoit usw natürlich eingesetzt werden.
 
ich bitte doch bei Bildungsfernheit nicht zu posten... Wen man keine Ahnung hat ODER SICH NICHTMAL DIE MÜHE MACHT DEN THREAD ZU Lesen ... dann sollte man nicht seinen Künstlichen Beitragscount mit so einem Bullshit-Kommentar hochziehen, aber jetzt hast ja 1801 da geht dir bestimmt einer ab...
 
Ideal wäre wirklcih das TSR-Programm...

Einfach an den Interrupt 8 hängen (Timer), der wird 18,2 mal pro Sekunde aufgerufen...

Ansonsten muss die VM eben zwingend den Fokus haben oder man auf jeden Fall im Script dafür sorgen...
 
Also das VB script funktioniert nicht ich denke mal dass das daran liegt dass der Tastendruck unter DOS simuliert werden soll... Also das Fenster in den Vodergrund rufen funktioniert mit AppActivate funktioniert einwandfrei...
Würde das mit diesem AutoIT funktionieren?
 
Klar, das ist der Befehl WinActivate("Titel des Fensters").
Den Titel des Fensters kannst zur Not auch über den Process finden.

AutoIt ist umsonst und kann natürlich auch .exe-Dateien erstellen.

Code:
Opt("MustDeclareVars", 1) ;sauberes programmieren => jede variable deklarieren; variablen sind aber Typenlos!! (Local, Global, Dim...)
Opt("WinTitleMatchMode", 2) ;Finde titel von Fenster auch nur mit einem Teil des texts (ie. "plore" in "Explorer)

Local $strTitle = "cmd.exe"
WinActivate($strTitle)
If WinActive($strTitle) Then
	Send("dir *meow*")
	Send("{ENTER}")
Else
	MsgBox(32, "Fehler", "Fenster nicht aktiv")
EndIf

der Kommandozeileninterpreter CMD.EXE ist als Konstante in AutoIt unter @COMSPEC
gespeichert, aber soweit ich gelesen hab, brauchst das nicht.



Falls du automatisieren willst dass das DOS Fenster die Befehle kriegt reicht das oben.
Kannst noch eine Schleife machen oder Sleep(1000) verwenden usw...

Falls du willst das die VM den Focus kriegt und dann das DOS Fenster focus und Befehle
senden, dann nimmst am Besten 2 Scripte.

Script 1:
Code:
WinActivate("VM")
If WinActive("VM")
    Send("#r") ;Windows Ausführen
    Send(@MyDocumentsDir & " \scriptname.exe") ;pfad zum script im My Documents Ordner
    Send("{ENTER}") ;abschicken
EndIf

Script2:
Code:
siehe oben ^^
 
Zuletzt bearbeitet:
Ich glaube das Problem an allen Skript-Lösungen ist, dass die VM ja alle Tastendrücke auf sich vereint. Solange man sich in der VM aufhält, wird beim Druck des Shortcuts nichts passieren weil dieser an die VM und nicht an den Host gesendet wird. Man müsste also immer erst aus dem VM-Fenster rausgehen, dann den Shortcut drücken und kann dann erst weitermachen.
Zweites Problem: evetuell unterstützt DOS nicht die simulierte Tasteneingabe, weil es eben sehr Hardware-nah ist. Keine Ahnung wie genau die VM das Signal des simulierten Tastendrucks an den Gast weiterreicht.

Ich guck mal, ob ich noch irgendwo meine alten Assembler-Quelltexte finde, irgendwo war da auch nen TSR-Programm-Rumpf bei, den bräucht ich dann nur umzustricken.

/edit: ja, hab den Programmrumpf gefunden... mal sehen was sich machen lässt.
/edit2: leider waren meine Assembler-Kenntnisse in den letzten Jahren offensichtlich starkem Schwund ausgesetzt, der TSR-Rumpf funktioniert zwar (Programm bleibt nach dem Beenden im Speicher und löscht sich bei zweiter Ausführung auch wieder aus diesem), aber auf die schnelle wollte mir kein geeigneter Code einfallen um auf Tastendruck mit dem Keyboard-Controller oder dem BIOS zu kommunizieren und die Tastendrücke abzugeben (könnte auch daran liegen, dass ich derzeit keine Referenzen hier hab für sowas ^^). Wer sich dennoch daran probieren will, hier der Assembler-Code für TASM/TLINK:

Code:
model tiny

dataseg
id                 dw 'AP'
alte_int_offset    dw ?
alte_int_segment   dw ?
INT_NR             db 80h
dummy              db ?
TSR_welcome        db "TSR-Programm aktiv!",10d,13d,"$"
TSR_end            db "TSR-Programm beendet!",10d,13d,"$"

codeseg
startupcode
  jmp     HAUPTPROGRAMM

  ISR     proc                          
;***************************************






;***************************************
  iret                                  
  ISR     endp                          

HAUPTPROGRAMM:
  mov     ah,35h                  
  mov     al,INT_NR               
  int     21h                     
  cmp     es:id,'AP'                 
  jz      RE_INSTALL                

  mov     alte_int_offset,bx           
  mov     alte_int_segment,es           
  mov     dx,offset ISR           
  mov     al,INT_NR                     
  mov     ah,25h                  
  int     21h                     
  mov     ah,09h
  mov     dx,Offset TSR_welcome
  int     21h
  mov     dx,offset dummy        
  mov     cl,4                       
  shr     dx,cl          
  inc     dx                        
  mov     ax,3100h
  int     21h                       

RE_INSTALL: 
  mov     ah,09h
  mov     dx,Offset TSR_end
  int     21h
  mov     ah,25h                  
  mov     al,INT_NR               
  mov     ds,es:alte_int_segment  
  mov     dx,es:alte_int_offset   
  int     21h                     
  push    es                  
  mov     es,es:[02ch]           
  mov     ah,49h                  
  int     21h                           
  pop     es                        
  mov     ah,49h                  
  int     21h                       
exitcode  0
END

Der Code für die Tastenabfrage/Eingabe muss zwischen den beiden mit Sternchen (*...) versehenen Textzeilen stehen. Die Befehlszeile für TASM lautet "tasm.exe /zn C:\xyz\tsr.asm" und für TLINK "tlink.exe /x /t C:\xyz\tsr.obj". Achtet auf die 8.3-Konventionen.
 
Zuletzt bearbeitet:
DOS? Dos ist wie Notepad, nichts anderes. Habs getestet und es Empfängt alles.
Du kannst sogar die Ausgabe mit STDIN abfagen usw...

Und aus einer VM zu kommen ist eine Zweile
Send("^+&") oder was auch immer der Shortcut ist, den man ja frei wählen kann und
schon ist man wieder im Host.

Das Ganze jetzt mit Mnemonic zu lösen find ich bissle überdimensioniert.
Aber klar, wenn der Threadersteller anstatt 10 Zeilen zu schreiben, Informatik
studieren möchte, ideal :D
 

Ähnliche Themen

Zurück
Oben