Mausklick mit CMD oder Programm imitieren
Hey Leute ich würde gerne von euch folgende Dinge wissen:
1. Habt ihr eine Vermutung, warum die Mausklicks, wo ich aktuell mit meiner CMD ausführen lasse nicht immer funktionieren?
Ich habe ein Script, dass täglich zu bestimmten Uhrzeiten bestimmte Programme öffnen sollen um meinen Arbeitsalltag zu vereinfachen. Das Problem ist aber, dass der Mausklick, wo aktuell von meiner CMD ausgeführt wird, nicht 100% zuverlässig ist. Es kommt leider äußerst häufig vor, dass der Klick irgendwie nicht erkannt bzw. ausgeführt wird. Zwar spring die Maus zur entsprechenden Position, aber der Klick wird scheinbar nicht immer erkannt.
Aktuell habe ich in meiner CMD folgenden Code drin:
2. Gibt es dann womöglich alternativen, wo 100% zuverlässig einen Mausklick an bestimmter Stelle ausführen können und wo der Mausklick immer erkannt wird?
Kennt ihr z.B. ein anderen Befehl oder ein externes Programm, dass man mit der CMD ansteuern kann?
Ich freue mich sehr über eine Antwort!
1. Habt ihr eine Vermutung, warum die Mausklicks, wo ich aktuell mit meiner CMD ausführen lasse nicht immer funktionieren?
Ich habe ein Script, dass täglich zu bestimmten Uhrzeiten bestimmte Programme öffnen sollen um meinen Arbeitsalltag zu vereinfachen. Das Problem ist aber, dass der Mausklick, wo aktuell von meiner CMD ausgeführt wird, nicht 100% zuverlässig ist. Es kommt leider äußerst häufig vor, dass der Klick irgendwie nicht erkannt bzw. ausgeführt wird. Zwar spring die Maus zur entsprechenden Position, aber der Klick wird scheinbar nicht immer erkannt.
Aktuell habe ich in meiner CMD folgenden Code drin:
set posX=489
set posy=471
powershell -ExecutionPolicy ByPass -Command ^"^
Add-Type -A System.Windows.Forms;^
Add-Type -Memberdefinition '[DllImport(\"user32.dll\")]public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);' -Namespace Tools -Name Mouse ;^
$pos = new-object System.Drawing.Point %posX%,%posY%;^
[System.Windows.Forms.Cursor]::Position = $pos;^
[Tools.Mouse]::mouse_event(2,$pos.X,$posY,0,0);^
[Tools.Mouse]::mouse_event(4,$pos.X,$posY,0,0);^
2. Gibt es dann womöglich alternativen, wo 100% zuverlässig einen Mausklick an bestimmter Stelle ausführen können und wo der Mausklick immer erkannt wird?
Kennt ihr z.B. ein anderen Befehl oder ein externes Programm, dass man mit der CMD ansteuern kann?
Ich freue mich sehr über eine Antwort!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 64200876295
Url: https://administrator.de/contentid/64200876295
Ausgedruckt am: 24.11.2024 um 03:11 Uhr
3 Kommentare
Neuester Kommentar
Moin.
Naja klicken kannst du so oft du willst, bringt aber nichts wenn das Programm worauf du klicken willst nicht aktiv und im Vordergrund steht, das musst du also auch erst in den Vordergrund holen, das machst du bei dir nicht.
Fenster in den Vordergrund holen mit PS geht z.B. so
Desweiteren fehlt bei dir das MOUSEEVENTF_ABSOLUTE Flag bei mouse_event das absolute Koordinaten signalisiert (0x8000)
Besser ist aber das Klickevent direkt auf Controls in Fenstern auszuführen.
Das machen bspw. folgende Tools sehr einfach:
Autoit , AutoHotkey & Co
Mit AutoIt sieht das z.B so aus
Gruß
Naja klicken kannst du so oft du willst, bringt aber nichts wenn das Programm worauf du klicken willst nicht aktiv und im Vordergrund steht, das musst du also auch erst in den Vordergrund holen, das machst du bei dir nicht.
Fenster in den Vordergrund holen mit PS geht z.B. so
Add-Type –memberDefinition '
[DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
' -name Window -namespace Tools
$hwnd = (Get-Process "DeineAnwendung").MainWindowHandle
[void][Tools.Window]::ShowWindow($hwnd,9)
[void][Tools.Window]::SetForegroundWindow($hwnd)
Desweiteren fehlt bei dir das MOUSEEVENTF_ABSOLUTE Flag bei mouse_event das absolute Koordinaten signalisiert (0x8000)
[Tools.Mouse]::mouse_event(0x8002,$pos.X,$posY,0,0);^
[Tools.Mouse]::mouse_event(0x8004,$pos.X,$posY,0,0);^
Besser ist aber das Klickevent direkt auf Controls in Fenstern auszuführen.
Das machen bspw. folgende Tools sehr einfach:
Autoit , AutoHotkey & Co
Mit AutoIt sieht das z.B so aus
BlockInput(1)
WinActivate("Mein Fenster")
$win = WinWaitActive("Mein Fenster","",10)
if $win <> 0 then
ControlClick("Mein Fenster","","Button28","left",1)
Endif
BlockInput(0)
Gruß
Moin,
wie immer natürlich fachlich einwandfreier Rat von unserem Multi-Username-Powershell-Spezialisten.
Gruß
DivideByZero
wie immer natürlich fachlich einwandfreier Rat von unserem Multi-Username-Powershell-Spezialisten.
Besser ist aber das Klickevent direkt auf Controls in Fenstern auszuführen.
Das machen bspw. folgende Tools sehr einfach:
Autoit , AutoHotkey & Co
+1 für Autoit und Konsorten, die über die Control-ID gehen. Denn der simulierte Mausklick kann selbst bei SetForegroundWindow scheitern, wenn in der winzigen Zeit bis zum anschließenden Mausklick z.B. ein Windows-Update-Fenster sich nach vorne schiebt (oder sonst eine Benachrichtigung etc.). Daher ist es immer empfehlenswert, das gewünschte Fenster zum aktiven zu machen und dort über die Events einen Maus- und tastaturunabhängigen "Click" auszulösen.Das machen bspw. folgende Tools sehr einfach:
Autoit , AutoHotkey & Co
Gruß
DivideByZero