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-Key: 64200876295

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

Printed on: June 21, 2024 at 06:06 o'clock

Member: hempel
hempel May 19, 2024 updated at 14:16:21 (UTC)
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ß
Member: DivideByZero
DivideByZero May 19, 2024 at 15:08:56 (UTC)
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
Member: em-pie
em-pie May 20, 2024 at 15:54:09 (UTC)
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…