meisterkunglao
Goto Top

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:

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!

Content-ID: 64200876295

Url: https://administrator.de/contentid/64200876295

Ausgedruckt am: 24.11.2024 um 03:11 Uhr

13034433319
13034433319 19.05.2024 aktualisiert um 16:16:21 Uhr
Goto Top
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
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ß
DivideByZero
DivideByZero 19.05.2024 um 17:08:56 Uhr
Goto Top
Moin,

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.

Gruß

DivideByZero
em-pie
em-pie 20.05.2024 um 17:54:09 Uhr
Goto Top
Moin,

+1 für AutoIT
Dort ist ein Tool enthalten, mit dem du die ControlIDs und Fensternamen ermitteln und ins Script einbetten lassen kannst.
Am Ende eine Exe generieren lassen und die per geplantem Task oder aus einer Batch heraus starten lassen…