Maus Beschleunigung per Batch beim Starten deaktivieren?

4 Antworten

Mit purem Batch geht das nicht,

Dazu müsste man schon auf Systemfunktionen wie SystemparametersInfo zugreifen. Dazu braucht man jedoch eine systemnahe Sprache (C++,C# etc).

Gegenwärtig habe ich jedoch keine Zeit mir die Sache näher Anzuschauen.

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

Hallo Einblock,

warum regulierst du nicht DPI an deiner Maus direkt und speicherst den Wert? Akut würde mir keine Software einfallen, die automatisch die Geschwindkeit meiner Maus verändert - außer die Maussoftware selber in der ich verschiedene Geschwindigkeitsprofile hinterlegt habe.

Woher ich das weiß:Berufserfahrung – Fachinformatiker

Einblock26 
Beitragsersteller
 05.09.2021, 14:18

Nein nein. Die DPI ist nicht das Problem. Das Problem ist die Maus beschleunigungs Einstellung in den Windows Einstellungen. Hat man diese aktiviert, bewegt sich der Zeiger weiter wenn man die Maus schneller Bewegt. Also hat man eine Distanz von sagen wir mal 30cm die ohne diese Einstellung einmal 360° Drehen bedeutet, ist bei eingeschalteter Einstellung ein schnelles bewegen der Maus 420° und langsames bewegen 200°. Deswegen kann man kaum richtig aimen da die DPI von der Geschwindigkeit der Maus abhängt und nicht davon was man eingestellt hat.

Dann exit hab ich mich vertan. Aber in meinem Fall soll das Consolen Fenster wieder geschlossen werden nach Ausführung.

Ich bin in diesen Sachen auch nur absoluter Laie ;) Aber bei mir nutzt auch mein Opa den Rechner und wenn da irgendwas passiert was er nicht kennt, ruft der mich immer an.

Hab das sogar per Aufgabenplanung automatisiert. Da nach dem letzten Win Update sich bei mir die Mausbeschleunigung automatisch nach dem Neustarten vom Rechner aktiviert.
Gruß xHazeBaze und schönes Wochenende

Mausbeschleunigung ist standardmäßig eingeschaltet. Außer in einigen Spielen ist diese Funktion nützlich, sonst würde man mit der Maus riesige Strecken zurücklegen müssen um den Bildschirm zu überbrücken.

Es macht wenig Sinn die Beschleunigung komplett abzuschalten, besser ist es in einer Batch vor dem Spiel abzuschalten und danach wieder an.

habs mal mit heißer Nadel gestrickt.

wie bereits erwähnt, mit Batch ist da normalerweise nichts zu machen .

...aber mit Batch kann man andere Sprachen verwenden...

Toggle_Mouse_Acceleration.cmd

@echo off
powershell "Add-Type -Memberdefinition '[DllImport("""user32.dll""")]public static extern Boolean SystemParametersInfo(UInt32 uiAction,UInt32 uiParam,IntPtr pvParam,UInt32 fWinIni);' -Namespace WinUser -Name Tools;[IntPtr]$mouseParamsPtr=[system.runtime.interopservices.marshal]::AllocHGlobal(12);[WinUser.Tools]::SystemParametersInfo(3,0,$mouseParamsPtr, 0)>$Null;[int32]$MouseAcc = [system.runtime.interopservices.marshal]::ReadInt32($mouseParamsPtr, 8);[system.runtime.interopservices.marshal]::WriteInt32($mouseParamsPtr,8,$MouseAcc -bxor 1);[WinUser.Tools]::SystemParametersInfo(4,0,$mouseParamsPtr,0)>$Null;$MouseAcc -bxor 1;[system.runtime.interopservices.marshal]::FreeHGlobal($mouseParamsPtr)"
pause

...Der Powershell-Einzeiler ist ein wahres Monster.

Letztlich geschiet nichts weiter als das ich die gleichen Funktionen anspreche, welche auch über die GUI bedient werden können. https://www.pcwelt.de/tipps/So-deaktivieren-Sie-die-Mausbeschleunigung-in-Windows-10-10795160.html

Jeder Aufruf schaltet in den "entgegengesetzten" Zustand

Die Batchzeile ist nur schwer lesbar, darum auch noch das gleiche als normales Powerschelscript.

Toggle_Mouse_Acceleration.ps1

[UInt32]$SPI_GETMOUSE = 0x0003
[UInt32]$SPI_SETMOUSE = 0x0004
Add-Type -Memberdefinition '[DllImport("user32.dll")]public static extern Boolean SystemParametersInfo(UInt32 uiAction,UInt32 uiParam,IntPtr pvParam,UInt32 fWinIni);' -Namespace WinUser -Name Tools
[IntPtr]$mouseParamsPtr = [system.runtime.interopservices.marshal]::AllocHGlobal(12) #get pointer to new int32 Array
[WinUser.Tools]::SystemParametersInfo($SPI_GETMOUSE, 0, $mouseParamsPtr, 0) #get Mouseparameters to allocated Array
[int32]$MouseAcc = [system.runtime.interopservices.marshal]::ReadInt32($mouseParamsPtr, 8) #read 3 interger
[system.runtime.interopservices.marshal]::WriteInt32($mouseParamsPtr, 8, $MouseAcc -bxor 1) #write back  negated Value
[WinUser.Tools]::SystemParametersInfo($SPI_SETMOUSE, 0, $mouseParamsPtr, 0) #set it
[system.runtime.interopservices.marshal]::FreeHGlobal($mouseParamsPtr) #free Memory
$MouseAcc -bxor 1 #show new state
pause

Hier noch etwas zum anpassen der Mousegeschwindigkeit:

set Mousespeed.cmd

@echo off
  rem Zahlen von 1 bis 20 erlaubt! default ist 10.
set "MouseSpeed=5" 
powershell "Add-Type -Memberdefinition '[DllImport("""user32.dll""")]public static extern Boolean SystemParametersInfo(UInt32 uiAction,UInt32 uiParam,IntPtr pvParam,UInt32 fWinIni);' -Namespace WinUser -Name Tools;[WinUser.Tools]::SystemParametersInfo(113, 0, %MouseSpeed%, 0)>$null"
pause

...dito lesbar als Powershellscript.

set Mousespeed.ps1

$MouseSpeed=5
[uint32]$SPI_SETMOUSESPEED = 0x0071
Add-Type -Memberdefinition '[DllImport("user32.dll")]public static extern Boolean SystemParametersInfo(UInt32 uiAction,UInt32 uiParam,IntPtr pvParam,UInt32 fWinIni);' -Namespace WinUser -Name Tools
[WinUser.Tools]::SystemParametersInfo($SPI_SETMOUSESPEED, 0, $MouseSpeed, 0)>$null
pause

natürlich kann man auf dieser Basis noch viel mehr beeinflussen, aber diese beiden kleinen Mousetweaker sollten für Deine Zwecke mehr als ausreichend sein.

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

dasistspam  19.11.2024, 23:40

Hi, ich weiß, der Thread ist übel alt, aber hast du noch was, um die Farbe, die Scrollgeschwindigkeit und die Größe des Mauszeigers und der Maus zu verändern per Skript?

Danke schonmal

Erzesel  20.11.2024, 16:52
@dasistspam

die Anzahl der Scrolllines fü das Scrollwheel zu setzen ist drivial, da es hierfür eine dokumentierte API-Funktion gibt.

scrollspeed.cmd

@echo off
  rem Zahlen von 0 bis 100 erlaubt! default ist 3.
set "MouseScrollLines=50" 
powershell "Add-Type -Memberdefinition '[DllImport("""user32.dll""")]public static extern Boolean SystemParametersInfo(UInt32 uiAction,UInt32 uiParam,IntPtr pvParam,UInt32 fWinIni);' -Namespace WinUser -Name Tools;[WinUser.Tools]::SystemParametersInfo(105, MouseScrollLines, 0, 2)>$null"

das ganze noch mal als pures Powershellscript Zeilenweise aufgelöst:

$MouseScrollLines=50 #default is 3
[uint32]$SPI_SETWHEELSCROLLLINES = 0x0069
Add-Type -Memberdefinition '[DllImport("user32.dll")]public static extern Boolean SystemParametersInfo(UInt32 uiAction,UInt32 uiParam,IntPtr pvParam,UInt32 fWinIni);' -Namespace WinUser -Name Tools
[WinUser.Tools]::SystemParametersInfo($SPI_SETWHEELSCROLLLINES, $MouseScrollLines, 0, 2)

etwas haariger wird es bereits bei der Größe der Mousecursors. da gibt es mehr als einen Ansatzpunkt und keiner davon ist dokumentiert.

Man kann die in der Registry unter HKEY_CURRENT_USER\Control Panel\Cursors gesetzte CursorBaseSize direkt via einer undokumentierten SPI aktivieren :

@echo off
 rem Zahlen von 1 bis Bildschirmgröße . default ist 32.
set "MouseCursorSize=256" 
powershell "Add-Type -Memberdefinition '[DllImport("""user32.dll""")]public static extern Boolean SystemParametersInfo(UInt32 uiAction,UInt32 uiParam,IntPtr pvParam,UInt32 fWinIni);' -Namespace WinUser -Name Tools;[WinUser.Tools]::SystemParametersInfo(8233, 0, %MouseCursorSize%, 2)>$null"

dito pur Powershell:

$MouseCursoSize=512   # Size in Pixel
[uint32]$Undocumented_SPI_SETMouseCursorBaseSize = 0x2029  #undocumented SPI-function  !!!SPI-Variablename is not the correct, only my fantasy!!! 
Add-Type -Memberdefinition '[DllImport("user32.dll")]public static extern Boolean SystemParametersInfo(UInt32 uiAction,UInt32 uiParam,IntPtr pvParam,UInt32 fWinIni);' -Namespace WinUser -Name Tools

[WinUser.Tools]::SystemParametersInfo($Undocumented_SPI_SETMouseCursorBaseSize, 0, $MouseCursoSize, 0x01);

...Auf irgentwelche Interaktionen bezüglich geänderte Screen DPI Settings möchte ich nicht eingehen...

das hat auch nichts mit den Mouse-Settings unter "erleichterte Bedienung" zu tun:

die Settings für "ms-settings:easeofaccess-mouse" lassen sich zwar im Registrykey "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Accessibility" mit den Werten CursorColor, CursorType, CursorSize ohne GUI setzen, aber sind erst nach dem nächsten Login aktiv. Das wiederum wäre langwieriger als das setzen im GUI.

setEaseMousePointers.ps1

$EaseAccessPath = 'HKCU:\SOFTWARE\Microsoft\Accessibility'


#Parts of Color
$Color_Red = 255
$Color_Green = 127
$Color_Blue = 77
$Color_Alpha = 0


#convert to Interger-ColorNumber
$CursorColor = [BitConverter]::toInt32([byte[]]@($Color_Red,$Color_Green,$Color_Blue,$Color_Alpha ),0)


#Defined CursorColorTypes
$Cursor_Default = 0
$Cursor_Black = 1
$Cusor_Inverted = 2
$Cursor_UserColor = 6


$CursorType = $Cursor_UserColor


#set the Registryvalues at HKCU\SOFTWARE\Microsoft\Accessibility
$MouseCursorPath = 'HKCU:\SOFTWARE\Microsoft\Accessibility'
Set-ItemProperty -Path $EaseAccessPath -Name CursorColor -Value $CursorColor 
Set-ItemProperty -Path $EaseAccessPath -Name CursorType -Value $CursorType 


$CursorSize = 12  # 1 to 15  default 1
Set-ItemProperty -Path $EaseAccessPath -Name CursorSize -Value $CursorSize
gp $MouseCursorPath #show  it
'Plaese Logoff and ReLogin'
pause

Die Cursorfarbe ist keine Option, welche direkt zu den Mousecursor-Funktionen gehört, sondern ist ein Filter für die erleichterte Bedienung. (Dafür wurde leider noch nirgends eine API-funktion erwähnt , Microsoft hat viele Geheimnisse , aber für eine Funktion, welche eigentlich keiner braucht, lohnt es nicht sich durch zig Programme zu "hacken")

um schnellen Zugriff zu haben erstelle eine Verknüpfung für :

ms-settings:easeofaccess-mousepointer

oder eine Batch/Powershellscript mit dem inhalt:

start ms-settings:easeofaccess-mousepointer
dasistspam  20.11.2024, 23:59
@Erzesel

vielen vielen Dank für die schnelle Antwort und die bereitgestellten Skripte und Infos :)

xHazeBaze  01.02.2024, 22:59

anstelle von pause wurde ich quit verwenden, damit das fenster automatisch geschlossen wird.

Erzesel  02.02.2024, 06:29
@xHazeBaze
anstelle von pause wurde ich quit verwenden...
ähm...?🤔... Nein.

Keine Ahnung ob Du Sachen, welche Du von Dir gibst auch selber testest? Im Falle von "Quit" , wäre Dir mit Sicherheit aufgefallen, dass weder Batch noch Powershell dieses Wort im Befehlssatz haben.

Die meisten heute gängigen Sprachen verwenden "Exit" . (oder lassen den Compiler/Interpreter entscheiden wie das Programm terminiert wird).

Ich weiß was ich weshalb tue/schreibe....

Im Falle meiner (hier an Anfänger/Laien gerichteten) Scripte/Programmcodes verhindere ich bewusst das Schließen der Console durch eine geeignete Eingabeaufforderung. (damit eventuelle Ausgaben/Fehlermeldungen etc sichtbar bleiben)

Ich gehe in der Regel davon aus, das dies den meisten Nutzern auch ohne weitere Erklärungen klar ist (und wenn schließen sie eben das Fenster von Hand).