Kann ich mit einer BATCH Datei meine Maus bewegen?

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.

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...😏

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

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

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

Schon, aber nicht mit einer batch Datei 😉

Gruß Sonic

0

Danke für die Inspiration...👍

0

Hallo,

selbst wenn - man kann die Maus positionieren, aber keine Bewegung emulieren, die ein Monitor oder Bildschirmschoner als Bewegung erkennen würde.

Gruß Sonic

Woher ich das weiß:Hobby – PC Schrauber & Video- Fotobearbeitung seit über 20 Jahren :)
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.

0

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.

0