Function SystemParametersInfo erwartet 1D Array als pvParam

  • 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
    [autoit]

    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    $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

    [/autoit]

    2 Mal editiert, zuletzt von pPanther (27. März 2011 um 09:01)

  • Moin,

    Zitat von MSDN

    Sets the two mouse threshold values and the mouse acceleration.

    Manchmal sind die Beschreibungen im MSDN recht "dünn". Die Reihenfolge der Angaben könnte man aber als zarten Hinweis auf die Reihenfolge im Array betrachten.

    Weil ich mir vielleicht auch nicht sicher gewesen wäre, hätte ich wohl einfach mit SPI_GETMOUSE (0x0003) probiert, in welcher Reihenfolge sie gelesen werden.

  • Ich nehme kein RegWrite weil ich ein Ergebnis sofort feststellen möche. Ohne Call stellt er zwar alles um, ich merke aber nix davon. Ich müsste also öfters neu starten bzw. mich ab- und anmelden.
    Selbst ein EnvUpdate() bringt mir bei meinen Eingriffen nicht den gewünschten Erfolg.
    Die Reihenfolge könnte man als Hinweis nehmen, ja in der Tat. Verlassen tu ich mich aber nicht drauf. Ich werde wohl nicht drum rumkommen für die Zukunft alles selbst vorab zu kontrollieren.

    Danke für die Hinweise.