Tastendruck mit Batch Datei Simulieren möglich?
Hallo. Meine Frage ist, ob man mit einer .bat Datei eine Taste Drücken kann zum Beispiel, wenn ich ein Word Dokument mit einer .bat Datei öffne, kann ich dann z.B. ein k schreiben mit einem Command wie press letter.k oder so?
Vielen Dank schonmal :D
2 Antworten
Mit klassischem Batch geht das nicht, allerdings mit VBScript.
Option Explicit
Call TestWordSchreiben()
Sub TestWordSchreiben()
Dim oDoc
Dim oWord
Dim sWorddatei
sWorddatei = "E:\Temp\Word mit Tastendruck.docx"
Set oWord = CreateObject("Word.Application")
Set oDoc = oWord.Documents.Open(sWorddatei)
oWord.Visible = True
oWord.Application.Activate
oWord.Selection.TypeParagraph()
oWord.Selection.TypeText "k"
oWord.Selection.TypeParagraph()
oDoc.SaveAs(sWorddatei)
oWord.Quit
Set oDoc = Nothing
Set oWord = Nothing
End Sub
PS: Die zweite Variante hat den Nachteil, dass sie u. U. eine Endlosschleife erzeugt. Es wird eine WSH-Instanz erzeugt und nicht beendet.
Deswegen kann das nur als Ansatz dienen. Man müsste noch einen Timeout oder so einbauen.
...
Do Until oShell.AppActivate(sFenstertitel)
Wscript.Sleep 500
Loop
...
...führt definitiv in eine Endlosschleife, da .AppActivate keinen Vollzug zurückliefert....
Entweder es hat geklappt oder Wenn das Fenster nicht da ist wird das nächstliegende Objekte focusiert , das irgendwie nur annähernd dem übergebenen String ähnelt. (Was Win für ähnlich hält, ist mir seit 20 Jahren ein Rätsel)
Darum immer reichlich Pause gönnen damit das angepeilte Programm auch Starten kann . Word könnte durchaus 3...4 Sekunden vertragen...
...führt definitiv in eine Endlosschleife
In meinem Test lief das nicht in eine Endlosschleife.
Meine Aussage war lediglich, dass es zu einer Endlosschleife kommen kann, wenn beim Start von Word oder mit dem Dokument etwas nicht stimmen sollte.
Beim Fenstertitel von AppActivate wird von links an auf Übereinstimmung geprüft. Zum Beispiel findet "abc.docx" das Fenster mit dem Titel "abc.docx - Microsoft Word App bla blub juhuu".
Hier kann es höchstens bei diversen Sonderzeichen Probleme geben, einen Match zu finden.
Zur Automatisierung kann ich nur AutoIT empfehlen. Das nutzt viele dieser Befehle aus VBScript, erweitert diese aber. Das Senden von Tastenkürzeln, Ansteuern der Maus und Öffnen und Aktivieren von Fenstern mit oder ohne zu warten bereitet der App keine Schwierigkeiten.
Wow vielen dank für die ganze Arbeit - der Teil mit dem Word öffnen wär nicht nötig gewesen - trotzdem danke.
hab ausversehen auf nicht hilfreich gedrückt - tut mir leid
ich sehe die Sache mit etwas JScript machbar...
Im Prinzip wäre auch VBScript möglich, jedoch das bekommt man nicht in eine Zeile verfrachtet.
@ echo off
::Nur zur Demo
::LeereDatei erzeugen
(call)>"meineDatei"
rem ich verwende zur Demo Notepad...
start "" Notepad "meineDatei"
rem egal es kommt auf den Fenstertitel an...
set "WindowNameToActivate=meineDatei - Editor"
rem kleines JScript, welches din der Kommandozeile übergebene Zeichenfolgen an ein Fenster mit der zuvor festgelegten Überschrift sendet...
echo WScript.Sleep(10);var t='';for (var i = 0; i ^< WScript.Arguments.Length;i++){t=t+WScript.Arguments(i)} ;WshShell=new ActiveXObject("WScript.shell");WshShell.AppActivate('%WindowNameToActivate%');WshShell.Sendkeys(t) >"test.js"
timeout 1 >nul
rem solange keine Sonderzeichen oder Spaces involviert sind kann alles ohne Gänsefüßchen gesendet werden...
cscript /nologo "test.js" "1|0|c|d|efghijklmnopqrstuvwxyz" {Enter} "blu mup" {Enter} mmahhhh murks
echo mache irgendwas anderes...
rem weiterschreiben
cscript /nologo "test.js" {Enter} "Weiter geht's"
pause
Hier die automatisch erzeugte JavaScript-Datei noch mal hübsch aufgedröselt
WScript.Sleep(10);
//sicherstellen das diese Variable auf jeden Fall definiert ist
var t='';
//alle übergebenen Parameter zusammenklatschen...;)
for (var i = 0; i < WScript.Arguments.Length;i++){
t=t+WScript.Arguments(i)
};
WshShell=new ActiveXObject("WScript.shell");
//gewünschtes Fenster in den Vordergrund holen...
WshShell.AppActivate('meineDatei - Editor');
//Daten senden...
WshShell.Sendkeys(t)
...
Alternative ohne Verwendung des Objektmodells von Office: