PowerShell Tastendruck simulieren?

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.

ArS123570 
Fragesteller
 15.03.2023, 14:15

Wie wende ich das an? Kannst du mir bitte ein Beispiel geben welches ich dann benutzen kann?

0

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.

Woher ich das weiß:Hobby
ArS123570 
Fragesteller
 16.03.2023, 14:52

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?

0
McHusky  16.03.2023, 17:09
@ArS123570

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.

1
ArS123570 
Fragesteller
 17.03.2023, 08:25
@McHusky

Danke, kann ich die Variabel $process auch ändern im verlaufe des scripts?

0
McHusky  17.03.2023, 09:09
@ArS123570

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.

0
ArS123570 
Fragesteller
 17.03.2023, 14:03
@McHusky

Deine Antwort ist passend zu meiner frage danke. Damit ich nochmals sicher gehe, wenn ich dort wo du Notepad geschriben hast, kann ich einfach die PID reinschreiben oder?

0
$TastenDruck = New-Object -ComObject wscript.shell;
$TastenDruck.SendKeys("{NUMPAD8}"
ArS123570 
Fragesteller
 15.03.2023, 14:16

Danke, ich habe deine zwei Zeilen benutzt jedoch funktioniert mein Skript nicht.

0