PowerShell Tastendruck simulieren?
Hallo ich möchte mit PowerShell ein .ps1 script schreiben. Das Script soll folgendes machen:
while ($i -le $repeatCount) {
Start-Sleep -Seconds 5
"taste num8 drücken"
Start-Sleep -Seconds 1
"taste num5 drücken"
Start-Sleep -Seconds 1
"taste enter drücken"
Start-Sleep -Seconds 6
"taste num2 drücken"
Start-Sleep -Seconds 1
"taste num5 drücken"
Start-Sleep -Seconds 1
"taste enter drücken"
$i++
}
Ich brauche das Script für ein Spiel, also sollte das Script auch für andere Anwendung verwendet werden können.
3 Antworten
Schau dir die Klasse SendKeys mal an.
Das Problem für dich wird aber weniger sein, einen Tastendruck auszulösen (simulieren ist Quark - da soll ja tatsächlich ein Tastendruck automatisiert erfolgen und nicht nur so getan werden als ob....)
Das Problem für dich wird eher sein, diesen Tastendruck an das gewünschte Window (sprich die gewünschte Zielanwendung) zu leiten.
Wie wende ich das an? Kannst du mir bitte ein Beispiel geben welches ich dann benutzen kann?
Ich würde so eine Taste drücken:
Add-Type -AssemblyName 'System.Windows.Forms'
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}{TAB}")
[System.Windows.Forms.SendKeys]::SendWait("0123456789 text xyz")
Die möglichen Tasten sind hier dokumentiert:
https://learn.microsoft.com/de-de/dotnet/api/system.windows.forms.sendkeys
Die Numpad Tasten sind nicht unterstützt, habe auch keinen sinnvollen Weg gefunden das mit PowerShell zu tun.
Es ist theoretisch möglich Numpad-Tasten mit der SendInput Methode der user32.dll-Bibliothek zu simulieren. Ich selbst bin dabei aber gescheitert.
Das drückt einfach die Tasten, egal welche Anwendung geöffnet ist. Wenn du sicherstellen möchtest, dass sie in einer bestimmten Anwendung gedrückt werden, müsstest du das entsprechende Fenster in den Vordergrund holen, z.B. so:
$process = Get-Process -Name "Notepad"
$mainWindowHandle = $process.MainWindowHandle
[Win32.WindowFunctions]::SetForegroundWindow($mainWindowHandle)
Damit würde ein laufender Texteditor in den Vordergrund geholt werden. Wären mehrere Fenster der selben Anwendung geöffnet, müsste man anhand des Fenstertitels oder der PID erst noch auf den richtigen Prozess filtern.
Die Frage verstehe ich nicht ganz. Also du kannst sie nennen wie du willst. Und du kannst sie auch wieder verwenden und überschreiben, wenn es darum gehen sollte Tasten in mehreren Anwendungen zu drücken. Um die Frage sinnhaft beantworten zu können, müsste ich besser verstehen was du überhaupt vor hast.
Für die PID gibt es den Parameter -Id, siehe auch https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-process?view=powershell-7.3
$TastenDruck = New-Object -ComObject wscript.shell;
$TastenDruck.SendKeys("{NUMPAD8}"
Danke, ich habe deine zwei Zeilen benutzt jedoch funktioniert mein Skript nicht.
Danke dir vielmals! Ich werde es später versuchen in mein script zu implementieren. Gehen die Tasten inputs für alle anwendungen oder muss ich da irgendwie eine anwendung angeben?