Kann ich mit einer BATCH Datei meine Maus bewegen?
Ich würde gerne wissen ob man mit einer windows-BATCH Datei den Mauszeiger auf dem Bildschirm bewegen kann. Als Troll ;)
6 Antworten
Wenn man sich nicht allein auf Batch als Programmiersprache beschränkt, kann man auch eigene Befehle in einer anderen Sprache kreieren...
Da @mnlwrnr mir bereits mit en Powershellscripten eine Steilvorlage geliefert hat, bleibe ich doch gleich Bei Powershell für das Unterprogramm, welches die Mausbewegung ausführt.
Neu ist das Konzept einer Hybrid-Batch nicht. Ich habe es bereits zig mal als Batch-HTA-Chimera Praktiziert.
- https://www.gutefrage.net/frage/welche-programmiersprache-soll-ich-lernen-die-auf-jedem-pc-ohne-spezielle-programme-laufen-kann#answer-336553162
- https://www.gutefrage.net/frage/bat-ideen#answer-342891804
Im Prinzip ist es mir Wurst ob ich ein Paar Klötzchen oder einen Mauszeiger herumirren lasse. (nur eine Antwort gibt es bei mir äußerst selten: "Geht nicht".)
Batch programmieren bedeutet für mich alle verfügbaren Ressourcen des Systems ohne Fremdsoftware bis an die äußersten Grenzen auszuschöpfen. Zu den Ressourcen von Windows gehören für mich auch die "eingebauten" Sprachen wie HTML/HTA , JavaScript, VBScript, Powershell, VB.Net, JS.Net, C#. Was man aus Batch aufrufen kann ist automatisch auch Teil dieser Sprache .
...jetzt zur Tat:
MouseMove1.cmd
<# : batch portion
@echo off
setlocal EnableDelayedExpansion
rem Maus bewegen
call :MoveMouse 0 0 1000
call :MoveMouse 1024 768 7000
call :MoveMouse 200 26 1000
pause
exit /b
::::::::::::::::: Subroutines :::::::::::::::::::::::::
:MoveMouse %1=ZielX %2=ZielY %3=Zeit in Millisekunden
echo Gehe zu Punkt: %~1 , %~2 in %~3 Millisekunden
powershell -noprofile "$DestPosX=%~1;$DestPosY=%~2;$MoveTime=%~3; iex (${%~f0} | out-string)"
exit /b
: end batch / begin powershell #>
Add-Type -AssemblyName System.Windows.Forms
# aktuelle Mauspoition
$x = [double]([System.Windows.Forms.Cursor]::Position).x
$y = [double]([System.Windows.Forms.Cursor]::Position).y
$FPS=60
#Anzahl der Schritte um de Bewegungszeit zum Ziel zu kommen
$Steps=([math]::Round($MoveTime /1000 * $FPS))
#Schrittweite pro Frame
$StepWidthX=($DestPosX - $X) /$Steps
$StepWidthY=($DestPosY - $Y) /$Steps
#um am Ende Rundungsfehler bei der Addition abzufangen einen Schritt weniger
for ($i=1;$i -lt $Steps ;$i++) {
$x += $StepWidthX
$y += $StepWidthY
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(([math]::Round($x)), ([math]::Round($y)))
#Schritte anzeigen # entfernen
'Step Nr: {0,4} ; x = {1,4} ; y = {2,4}' -f $i,$([math]::Round($x)),$([math]::Round($y))
Start-Sleep -Milliseconds ($MoveTime/$steps)
}
#letzter gezielter Schritt zur Endposition
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($DestPosX, $DestPosY)
...natürlich hätte ich das Ding auch komplett in Powershell schreiben können, aber wo bliebe dann der Spaß. Die Subroutine erlitigt das Esenzielle, dem Mauscursor von Punkt a nach Punkt B bewegen. Mehr muss sie garnicht tun.
In Batch sagen wir ihr was das Objekt (Mauscursor) tun soll und fertig. Der Code der Subroutinen bleibt dabei unangetastet.
...aber nun Butter bei die Fische:
RandomMouseMove.cmd
<# : batch portion
@echo off
rem Diese Batch in die Taskleiste minimiert starten (sonst nach das Ganze doch keinen Spaß)
if "%~1"=="min" goto :Main
start "" /min cmd /c "%~f0" min
exit /b
:Main
setlocal EnableDelayedExpansion
rem Zeit in Sekunden, welche die Schleife laufen soll
rem Maximale Ausführungszeit 2147483 Sekunden = ca.24 Tage
rem Achtung!!!! die Vorbrechnung der Werte für 24 Stunden=86400sec dauert ca 5 Minuten
rem desshalb sind Maximal 3600 Sekunden Zeitlich vertretbar (bis dahin hat der Nutzer schon längst die Resettaste gedrückt ;p)
rem hier 60 Sekunden
set "MaxExecutionTime=60"
rem Bewegungszeitbegrenzung für Zufallswerte (Millisekunden)
set "MoveTimeMin=100"
set "MoveTimeMax=7000"
rem Monitorgröße ermitteln
for /f "usebackq skip=1 tokens=1,2" %%a in (`wmic path Win32_VideoController get CurrentHorizontalResolution^,CurrentVerticalResolution ^| findstr /r /v "^$"`) do (
set "ScreenX=%%a"
set "ScreenY=%%b"
)
rem Sekunden zu Millisekunden umrechnen
set /a "MaxExecutionTime*=1000"
rem alle Züge vorberechnen
rem der Grund dafür ist, dass die Zeiten für die Bewegungen Zufällig sind,
rem aber die Gesamtlaufzeit vorgegeben ist. Die Summe der Zufallszeiten %ExecutionTime% ergibt
rem den Vergleichswert für die maximale Laufzeit
:TimesLoop
set /a "MoveCount+=1"
set /a "RandTime=%RANDOM% %% (MoveTimeMax - MoveTimeMin+1) + MoveTimeMin"
set /a "RandX=%RANDOM% %% (ScreenX+1)"
set /a "RandY=%RANDOM% %% (Screeny+1)"
set /a "ExecutionTime=ExecutionTime+RandTime"
if %ExecutionTime% lss %MaxExecutionTime% (
set "MoveParams.%MoveCount%=%RandX% %Randy% %RandTime%"
goto :TimesLoop
) else (
rem einfach Stumpsinnig die Restzeit für den letzten Zug
set /a "RandTime=MaxExecutionTime - ExecutionTime"
set "MoveParams.%MoveCount%=%RandX% %Randy% %RandTime%"
set /a "ExecutionTime=ExecutionTime+RandTime"
)
rem zum Anzegen der Variablen :: entfernen
::set MoveParams
rem Gespeicherte Zufallswerte Ausführen
for /l %%a in (1,1,%MoveCount%) do (
call :MoveMouse !MoveParams.%%a!
)
exit /b
::::::::::::::::: Subroutines :::::::::::::::::::::::::
:MoveMouse %1=ZielX %2=ZielY %3=Zeit in Millisekunden
echo Gehe zu Punkt: %~1 , %~2 in %~3 Millisekunden
powershell -noprofile "$DestPosX=%~1;$DestPosY=%~2;$MoveTime=%~3; iex (${%~f0} | out-string)"
exit /b
: end batch / begin powershell #>
Add-Type -AssemblyName System.Windows.Forms
$x = [double]([System.Windows.Forms.Cursor]::Position).x
$y = [double]([System.Windows.Forms.Cursor]::Position).y
$FPS=60
#Anzahl der Schritte um de Bewegungszeit zum Ziel zu kommen
$Steps=([math]::Round($MoveTime /1000 * $FPS))
#Schrittweite pro Frame
$StepWidthX=($DestPosX - $X) /$Steps
$StepWidthY=($DestPosY - $Y) /$Steps
#um am Ende Rundungsfehler bei der Addition abzufangen einen Schritt weniger
for ($i=1;$i -lt $Steps ;$i++) {
$x += $StepWidthX
$y += $StepWidthY
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(([math]::Round($x)), ([math]::Round($y)))
#Schritte anzeigen # entfernen
#'Step Nr: {0,4} ; x = {1,4} ; y = {2,4}' -f $i,$([math]::Round($x)),$([math]::Round($y))
Start-Sleep -Milliseconds ($MoveTime/$steps)
}
#letzter gezielter Schritt zur Endposition
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($DestPosX, $DestPosY)
da sage einer es ginge nicht...😏
hallo zusammen es geht man kann batch mit der mouse bedinen
SKRIPT:
@echo off & setlocal enabledelayedexpansion enableextensions
if /i not exist "MineColor.dll" echo MineColor.dll muss im gleichen verzeichnis ligen &echo.&pause&exit
set "gpu=MineColor.dll"
:GO
cls
echo.
echo.
echo -------------------------
echo Websteite WWW.GOOGEL.DE
echo -------------------------
echo.
echo -------------------------
echo Desktop Ordner Oeffnen
echo -------------------------
echo.
echo.
echo Klicke mit Mause !
:GO-Mouse
for /f "tokens=1,2,3" %%a in ('!gpu! mouse') do set/a x=%%b,y=%%c
if !y! geq 3 if not !y! geq 5 if !x! geq 1 if not !x! geq 25 start www.google.de
if !y! geq 7 if not !y! geq 9 if !x! geq 1 if not !x! geq 25 start %userprofile%\desktop
goto GO-Mouse
ARBER MineColor.dll muss im gleichen verzeichnis ligen
link zu MineColor.dll
www. mediafire .com /file /0gbs4 zd1c8ed9eh/Mine Color .txt /file
du musst alle leer zeichen aus dem link löchen sonst konnte ich den link nicht senden
und anschlißend das .TXT zu .DLL ändern ...!
schreib mich an wenn du mehr infos brauchst
www.mediafire .com/file/0gbs4zd1c8ed9eh/MineColor.txt/file
entverne die leer taste nach www.mediafire
Mit der Windows 10 Powershell geht das. Hier ein Beispiel: https://gist.github.com/MatthewSteeples/ce7114b4d3488fc49b6a
Dann kann man mit diesem Tool das Poweshell-Skript in eine EXE-Datei umwandeln: https://gallery.technet.microsoft.com/scriptcenter/PS2EXE-GUI-Convert-e7cb69d5
Hallo,
selbst wenn - man kann die Maus positionieren, aber keine Bewegung emulieren, die ein Monitor oder Bildschirmschoner als Bewegung erkennen würde.
Gruß Sonic
man kann die Maus positionieren, aber keine Bewegung emulieren, die ein Monitor oder Bildschirmschoner als Bewegung erkennen würde.
Natürlich geht das Teste meine Batch. Alle Items auf dem Desktop reagieren als wurden sie Von der Echten Maus berührt.
Was die Emulation einer Bewegung betrifft, so ist Bewegung nichts weiter als eine Abfolge einzelner Positionsereignisse
In "MouseMove1.cmd" zeige ich die einzelnen Positionsereignisse im Fenster.
Dazu bräuchte man Zugriff auf den Maustreiber von Windows und da kommt man vom CMD aus nicht dran. Es ist also nicht möglich.
Dazu bräuchte man Zugriff auf den Maustreiber von Windows
nö... man braucht nur Zugriff auf die .Net-Bibliothek und der ist mit Powershell, Javascript oder C# möglich. Alle drei sind ohne externe Hilfmittel aus Batch heraus on the Fly ausführbar.
Schon, aber nicht mit einer batch Datei 😉
Gruß Sonic