Tastendruck mit Batch Datei Simulieren möglich?

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
Woher ich das weiß:Hobby
nimeineb 
Fragesteller
 15.10.2019, 12:51

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

0
Suboptimierer  15.10.2019, 12:55

Alternative ohne Verwendung des Objektmodells von Office:

Sub TestWordSchreiben2
    Dim oShell
    Dim sFenstertitel
    Dim sWorddatei

    Set oShell = CreateObject("WScript.Shell")
    sFenstertitel = "Word mit Tastendruck.docx"
    sWorddatei = """E:\Temp\Word mit Tastendruck.docx"""
	
    oShell.Run "winword.exe " & sWorddatei
    Do Until oShell.AppActivate(sFenstertitel)
        Wscript.Sleep 500
    Loop
    oShell.SendKeys "k"

    Set oShell = Nothing
End Sub
2
Suboptimierer  15.10.2019, 13:15
@Suboptimierer

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.

0
Erzesel  15.10.2019, 14:54
@Suboptimierer

...
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...

0
Suboptimierer  15.10.2019, 15:29
@Erzesel
...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.

0

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) 

...

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren