Maus Eigenschaften permanent verändern

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von MrHelpless.

    Maus Eigenschaften permanent verändern

    Hallo und guten Tag,

    ich möchte ein Tool machen mit dem man die Maus modifizieren kann.
    Es wird nichts großes, da es mir nur darum geht mehr in Basic zu verstehen.
    Jetzt wollte ich mit meinem Tool den Mauscursor bearbeiten aber halt nicht nur in meiner Form sondern für allgemein (Desktop, usw...).
    Beispiel: Einen Mausschatten, andere .cur als Cursor oder die Mausgeschwindigkeit.
    Das sollte dann nach Möglichkeit dauerhaft sein, also nicht so das es nach dem nächsten neustart alles resetet ist.
    Ich bin auch schon soweit gekommen das ich das dann ja in der Registry ändern muss aber irgendwie haut das bei mir nicht hin.

    Hier gucke ich ob die Maus bereits einen Schaten hat. Das funktioniert auch soweit.

    VB.NET-Quellcode

    1. Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Dim NewKey As RegistryKey = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", True)
    3. Dim data As Byte() = DirectCast(NewKey.GetValue("UserPreferencesMask"), Byte())
    4. If Data(1) = 62 Then 'Pointer Shadow Active?
    5. CheckBoxMouseShadow.Checked = True
    6. ElseIf Data(1) = 30 Then 'Pointer Shadow Inactive?
    7. CheckBoxMouseShadow.Checked = False
    8. End If
    9. End Sub


    Hier möchte ich denn Schatten entweder Aus- oder Anschalte. Das funktioniert noch nicht.

    VB.NET-Quellcode

    1. Private Sub CheckBoxMouseShadow_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBoxMouseShadow.CheckedChanged
    2. 'Open Registry Key
    3. Dim NewKey As RegistryKey = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", True)
    4. 'Check Type Of Value In UserPreferencesMask
    5. If NewKey.GetValueKind("UserPreferencesMask") = RegistryValueKind.Binary Then
    6. 'Get Current Value
    7. Dim data As Byte() = DirectCast(NewKey.GetValue("UserPreferencesMask"), Byte())
    8. If CheckBoxMouseShadow.Checked = True Then
    9. data(1) = 62 'Set To 62 ( Activate Pointer Shadow )
    10. ElseIf CheckBoxMouseShadow.Checked = False Then
    11. data(1) = 30 'Set To 62 ( Inactivate Pointer Shadow )
    12. End If
    13. NewKey.SetValue("UserPreferencesMask", data) 'Update Registry
    14. End If
    15. End Sub


    Ich hab bis jetzt noch mit keinem meiner Programme etwas in der Registrybearbeitet und da bei mir auch kein Fehlercode kommt wollte ich euch Mal fragen weshalb das mit dem zweiten Codeshnipsel nicht hinhauen kann.
    Ich freue mich über jegliche hilfe.

    Mit freundlichen Grüßen
    MrHelpless
    Mit freundlichen Grüßen
    MrHelpless

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MrHelpless“ ()

    @MrHelpless Willkommen im Forum. :thumbup:
    Woher hast Du die Information, dass das 2. Byte von UserPreferencesMask den Zustand "Pointer Shadow" beschreibt?
    Ist das kompatibel mit diesem Vorgehen: techfrage.de/question/10744/wi…vieren-oder-deaktivieren/
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @MrHelpless Willkommen im Forum. Woher hast Du die Information, dass das 2. Byte von UserPreferencesMask den Zustand "Pointer Shadow" beschreibt?Ist das kompatibel mit diesem Vorgehen: techfrage.de/question/10744/wi…vieren-oder-deaktivieren/​

    @RodFromGermany Ja, ziemlich genau das möchte ich auch erreichen. :D

    ​technet.microsoft.com/en-us/library/cc957204.aspxwinfaq.de/faq_html/Content/tip…linefaq.php?h=tip0371.htmmsfn.org/board/topic/73209-hkc…sktopuserpreferencesmask/Habe ich so auf die schnelle gefunden und versuche da jetzt mal durch zu blicken.

    @FormFollowsFunction Da hast du ja einiges gefunden, ich weiß nur nicht wie ich die Hexadezimalzahlen nutzen soll (wo einsetzen).

    Zu Anfang habe ich einen teil aus dem Code genutzt: codeguru.com/vb/gen/vb_general…ngs-With-VBNET.htm#page-3
    Hier wird einmal gezeigt wie ich erfahre ob ich bei meinem Cursor einen Schatten hab und wie ich dies wieder ändern kann. Das auslesen ob ein Schatten vorhanden ist funktioniert, ändern klappt noch nicht.

    VB.NET-Quellcode

    1. ​Private Sub btnGetPointerShadow_Click(ByVal sender As System.Object, _
    2. ByVal e As System.EventArgs) Handles btnGetPointerShadow.Click
    3. 'Open Registry Key
    4. Dim NewKey As RegistryKey = _
    5. Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", True)
    6. 'Check Type Of Value In UserPreferencesMask
    7. If NewKey.GetValueKind("UserPreferencesMask") = _
    8. RegistryValueKind.Binary Then
    9. 'Get Current Value
    10. Dim data As Byte() = _
    11. DirectCast(NewKey.GetValue("UserPreferencesMask"), Byte())
    12. If data(1) = 62 Then 'Pointer Shadow Active?
    13. chkPointerShadow.Checked = True
    14. ElseIf data(1) = 30 Then 'Pointer Shadow Inactive?
    15. chkPointerShadow.Checked = False
    16. End If
    17. End If
    18. End Sub
    19. Private Sub btnChangePointerShadow_Click(ByVal sender As System.Object, _
    20. ByVal e As System.EventArgs) Handles btnChangePointerShadow.Click
    21. 'Open Registry Key
    22. Dim NewKey As RegistryKey = _
    23. Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", True)
    24. 'Check Type Of Value In UserPreferencesMask
    25. If NewKey.GetValueKind("UserPreferencesMask") = _
    26. RegistryValueKind.Binary Then
    27. 'Get Current Value
    28. Dim data As Byte() = _
    29. DirectCast(NewKey.GetValue("UserPreferencesMask"), Byte())
    30. data(1) = 62 'Set To 62 ( Activate Pointer Shadow )
    31. NewKey.SetValue("UserPreferencesMask", data) 'Update Registry
    32. End If
    33. End Sub
    Ich habe es so umgeformt wie ich dachte das es klappen könnte. Tut es ja aber nicht.

    @FormFollowsFunction Was oder wie kann ich mit denn Hexadezimalzahlen was anfangen?
    Falls du nicht so viel schreiben möchtest reicht mir auch ein Link.

    Mit freundlichen Grüßen
    MrHelpless
    Mit freundlichen Grüßen
    MrHelpless
    Du hast die Seite von deinem Link schon bis zu Ende gelesen, oder?
    Note: You may expect that all these settings will be applied automatically; unfortunately, that is not not the case. Only a reboot of the computer will update your changed settings. For these settings to applied immediately, you would have to restart explorer.exe. To achieve this, you will need to use the SendMessageTimeout API. Due to time constraints, this is not included in this article, but watch out for my following article that deals with TaskBar settings.
    ​Du hast die Seite von deinem Link schon bis zu Ende gelesen, oder?

    @HenryV Ja, ich habe mein bestes gegeben alles zu verstehen, irgendwas muss ich aber übersehen.
    Wenn es darum geht das man erst in HKEY_CURRENT_USER\Control Panel\Desktop und HKEY_CURRENT_USER\Control Panel\Mouse navigieren muss, hätte ich keine Ahnung wie ich dass machen sollte. Wenn es an etwas anderen liegt wäre es nett wenn du mir einen Hinweis geben könntest was ich übersehe.
    Mit freundlichen Grüßen
    MrHelpless
    Am Ende der verlinkten Seite steht ja.
    Nur ein Neustart des Computers aktualisiert Ihre geänderten Einstellungen. Damit diese Einstellungen sofort wirksam werden, müssten Sie explorer.exe neu starten. Um dies zu erreichen, müssen Sie die SendMessageTimeout API verwenden.

    Also die Änderung wird in der Registry durchgeführt und wird erst durch einen Neustart ersichtlich.
    Dies habe ich ausprobiert und kann es bestätigen. Ich hatte dazu das Beispiel modifiziert.
    Code

    VB.NET-Quellcode

    1. Private Sub btnChangePointerShadow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnChangePointerShadow.Click
    2. Dim NewKey As RegistryKey = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", True) 'Open Registry Key
    3. If NewKey.GetValueKind("UserPreferencesMask") = RegistryValueKind.Binary Then 'Check Type Of Value In UserPreferencesMask
    4. Dim data As Byte() = DirectCast(NewKey.GetValue("UserPreferencesMask"), Byte()) 'Get Current Value
    5. If chkPointerShadow.Checked = True Then
    6. data(1) = 62 'Set To 62 ( Activate Pointer Shadow )
    7. Else
    8. data(1) = 30 'Set To 30 ( Deactivate Pointer Shadow )
    9. End If
    10. NewKey.SetValue("UserPreferencesMask", data) 'Update Registry
    11. End If
    12. End Sub
    Danach habe ich ein wenig mit der SendMessageTimeout API experimentiert, was aber zu keinem Ergebnis geführt hat. Beispiel von hier.
    Code

    VB.NET-Quellcode

    1. Private Const HWND_BROADCAST = &HFFFF& 'Send To All
    2. Private Const WM_SETTINGCHANGE = &H1A 'Setting Change
    3. Private Const SMTO_ABORTIFHUNG = &H2 'Stop If Hang
    4. 'Send Message & Wait
    5. Declare Auto Function SendMessageTimeout Lib "User32" ( _
    6. ByVal hWnd As Integer, _
    7. ByVal Msg As UInt32, _
    8. ByVal wParam As Integer, _
    9. ByVal lParam As Integer, _
    10. ByVal fuFlags As UInt32, _
    11. ByVal uTimeout As UInt32, _
    12. ByRef lpdwResult As IntPtr _
    13. ) As Long
    14. Public Sub EnvRefresh() ' Refresh Explorer
    15. Dim EnvResult As IntPtr 'Result
    16. SendMessageTimeout(HWND_BROADCAST, _
    17. Convert.ToUInt32(WM_SETTINGCHANGE), _
    18. 0, 0, _
    19. Convert.ToUInt32(SMTO_ABORTIFHUNG), _
    20. Convert.ToUInt32(2000), _
    21. EnvResult) 'Broadcast A Setting Change To All
    22. End Sub

    Fazit: Die Änderung in der Einstellung in der Registry funktioniert, das Sichtbarmachen ohne Neustart nicht.
    Vielleicht weiss jemand anders noch Rat.
    Gruss HenryV
    @HenryV Trotzdem schon mal danke. Das hab ich echt überlesen.
    Dann muss ich jetzt nur noch einen Weg finden die explorer.exe sicher zu schließen und anschließend wieder zu starten.
    Den Prozess zu killen ist da ja nicht die beste alternative. :D
    Mit freundlichen Grüßen
    MrHelpless
    Ich kill nun doch denn Explorer und starte ihn anschließend wieder neu, die Einstellungen werden dadurch dennoch nicht aktualisiert.

    Code:

    VB.NET-Quellcode

    1. Private Sub restartExplorer()
    2. Dim p = Process.GetProcessesByName("explorer")
    3. p(0).Kill()
    4. p(0).WaitForExit()
    5. Process.Start("explorer.exe")
    6. End Sub


    Falls noch wer eine Idee hat wie man das regeln könnte, gerne reinschreiben.
    Mit freundlichen Grüßen
    MrHelpless