Hallo alle zusammen!
Ich beschäftige mich gerade mit den Mauseigenschaften, vorallem wie ich sie verändern kann.
Konkret geht es um die "Zeigerbeschleunigung". In meinem kleinen Programm kann man sie nicht nur aktivieren und deaktivieren, sondern auch noch die Stärke der Verbesserung in 3 Stufen einstellen (schwach, mittel, stark).
Ich habe das alles hinbekommen - dank des Hinweises von Schnitzel in meinem Eröffnungspost.
Um die Zeigerbeschleunigung zu verändern, sind 3 Werte dafür zuständig:
HKU\Control Panel\Mouse
MouseSpeed
MouseThreshold1
MouseThreshold2
Ich habe hierzu zu den 3 möglichen Stufen ein Array erstellt, welches je nach Stufe andere Werte enthält.
$wert[0] = MouseSpeed
$wert[1] = MouseThreshold1
$wert[2] = MouseThreshold2
Dieses Array übergebe ich mit DLLCall an die Funktion "SystemParametersInfo" in der user32.dll
Nun habe ich aber festgestellt, dass der Call mir meine Werte verdreht.
Also SystemParametersInfo erwartet nicht MouseSpeed als 1, sondern MouseThreshold1, dann 2 und zum Schluss MouseSpeed.
Woher zum Teufel soll ich wissen, in welcher Reihenfolge ich das Array übergeben soll?
Auf http://msdn.microsoft.com/en-us/library/…7(v=vs.85).aspx unter SPI_SETMOUSE (0x0004) steht nur, dass als pvParam ein Array übergeben werden muss. Jedoch nicht in welcher Reihenfolge die Werte erwartet werden. Daher nahm ich die (Alphabetische) Reihenfolge aus der Registry - was falsch war.
Gibts irgendwo einen Hinweis für die Zukunft, damit mir das nicht nochmal passiert? Wie finde ich heraus, in welcher Reihenfolge ich zukünftige Arrays übergeben muss?
Zur Verdeutlichung (Array Index verdreht):
Spoiler anzeigen
; smooth the mousespeed
Func SmoothMouseSpeed($value)
Local $values[3]
If GUICtrlGetState($combo) = 144 Then $value = 4
Switch($value)
Case 1
$values[0] = 1
$values[1] = 7
$values[2] = 0
Case 2
$values[0] = 2
$values[1] = 4
$values[2] = 12
Case 3
$values[0] = 2
$values[1] = 4
$values[2] = 6
Case 4
$values[0] = 0
$values[1] = 0
$values[2] = 0
EndSwitch
$struct = DllStructCreate("int[3]")
DllStructSetData($struct, 1, $values[1], 1)
DllStructSetData($struct, 1, $values[2], 2)
DllStructSetData($struct, 1, $values[0], 3)
$ret = DllCall("user32.dll", "int", "SystemParametersInfo", "int", 0x0004, "int", 0, "ptr", DllStructGetPtr($struct), "int", $BOTH)
EndFunc