Prüfen ob Autostart-Registry-Eintrag ja oder nein ?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Gelöschter Benutzer.

    Prüfen ob Autostart-Registry-Eintrag ja oder nein ?

    Hallo,

    Mein Programm hat eine "Einstellungs-Form" in welcher der Nutzer auswählen kann, ob das Programm per Autostart gestartet werden soll oder nicht.
    Das der Eintrag gemacht bzw. entfernt wird, funktioniert schon einwandfrei.

    Nur wenn ich abfrage, ob mein Programm als Autostart eingetragen ist, bekomme ich immer die Antwort, dass es eingetragen ist. Egal ob es eingetragen ist oder nicht.

    Wie sieht die richtige Abfrage dafür aus? Die Abfrage mache ich über den Button1

    VB.NET-Quellcode

    1. Option Explicit On
    2. Option Strict On
    3. Imports System
    4. Imports System.Net
    5. Imports System.Net.Sockets
    6. Imports System.Runtime.InteropServices
    7. Imports System.Net.NetworkInformation
    8. Imports System.IO
    9. Imports System.Text
    10. Imports System.Diagnostics
    11. Imports System.ComponentModel
    12. Imports System.Drawing
    13. Imports System.Management
    14. Imports Microsoft.Win32
    15. Public Class Einstellungen
    16. Private Sub Einstellungen_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    17. End Sub
    18. Private Sub Einstellungübernehmen_Click(sender As Object, e As EventArgs) Handles Einstellungübernehmen.Click
    19. If Autostart_Checkbox.Checked = True Then
    20. AddCurrentKey(My.Application.Info.AssemblyName, System.Reflection.Assembly.GetEntryAssembly.Location)
    21. MsgBox("wird eingetragen")
    22. Else
    23. RemoveCurrentKey(My.Application.Info.AssemblyName)
    24. MsgBox("wird NICHT eingetragen")
    25. End If
    26. 'Me.Close()
    27. End Sub
    28. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    29. If My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "Test", AppOrdner & AppExe) IsNot Nothing Then
    30. MsgBox("ist eingetragen")
    31. Else
    32. MsgBox("NICHT eingetragen")
    33. End If
    34. End Sub
    35. Private Sub AddCurrentKey(ByVal name As String, ByVal path As String)
    36. Dim key As RegistryKey = Registry.LocalMachine.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True)
    37. key.SetValue(name, path)
    38. key.Close()
    39. End Sub
    40. Private Sub RemoveCurrentKey(ByVal name As String)
    41. Dim key As RegistryKey = Registry.LocalMachine.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True)
    42. key.DeleteValue(name, False)
    43. key.Close()
    44. End Sub
    45. End Class

    zauber777 schrieb:

    If My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "Test", AppOrdner & AppExe) IsNot Nothing Then


    Der Hund liegt da vergraben. Wenn Du schreibst

    VB.NET-Quellcode

    1. Dim Testobjekt = My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "Test", AppOrdner & AppExe)

    und nen Haltepunkt danach setzt, erkennst Du, dass bei nichtexistentem Wert des Registryeintrags nicht "Nothing" zugewiesen wurde, sondern ein Leerstring. Daher wäre wohl die korrekte Abfrage:

    VB.NET-Quellcode

    1. If String.IsNullOrEmpty(My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "Test", AppOrdner & AppExe).ToString) Then

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Leider bleibt es dabei, dass mir immer nur die "else" (Nicht eingetragen) ausgegeben wird.

    VB.NET-Quellcode

    1. Private Sub Einstellungübernehmen_Click(sender As Object, e As EventArgs) Handles Einstellungübernehmen.Click
    2. If Autostart_Checkbox.Checked = True Then
    3. AddCurrentKey(My.Application.Info.AssemblyName, System.Reflection.Assembly.GetEntryAssembly.Location)
    4. MsgBox("wird eingetragen")
    5. Else
    6. RemoveCurrentKey(My.Application.Info.AssemblyName)
    7. MsgBox("wird NICHT eingetragen")
    8. End If
    9. 'Me.Close()
    10. End Sub
    11. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    12. Dim AppOrdner As String = Application.StartupPath
    13. Dim AppPfad As String = Application.ExecutablePath
    14. Dim AppExe As String = AppPfad.Replace(AppOrdner, "")
    15. If String.IsNullOrEmpty(My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "Test", AppOrdner & AppExe).ToString) Then
    16. MsgBox("ist eingetragen")
    17. Else
    18. MsgBox("NICHT eingetragen")
    19. End If
    20. End Sub
    21. Private Sub AddCurrentKey(ByVal name As String, ByVal path As String)
    22. Dim key As RegistryKey = Registry.LocalMachine.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True)
    23. key.SetValue(name, path)
    24. key.Close()
    25. End Sub
    26. Private Sub RemoveCurrentKey(ByVal name As String)
    27. Dim key As RegistryKey = Registry.LocalMachine.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True)
    28. key.DeleteValue(name, False)
    29. key.Close()
    30. End Sub
    @zauber777 Ok, Fehler gefunden. Beim Schreiben oder Löschen verwendest Du als Wertname den Namen der Anwendung und als Wert selbst den Dateipfad. Beim Überprüfen in Button1_Click hingegen liest Du im Schlüssel gibst Du den Wertnamen "Test" an. Solange Deine Anwendung nicht "Test" heißt, kommt nichts Sinnvolles dabei raus, da Du einen anderen Registryeintrag auswertest, als Du wolltest.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @ Fakiz : Die IF-Abfrage soll abfragen, ob in der Registry unter "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" mein Programm names "Con-Tool" eingetragen ist oder nicht.

    @ VaporiZed : du hast Recht, dass ich da noch "Test" stehen hatte. Dies habe ich jetzt auch schon geändert zum Namen meines Tools, wie es auch in der Registry steht "Con-Tool". Jedoch gibt er mir weiterhin nur an, dass es nicht eingetragen ist. Somit liegt es wohl auch nicht daran ;(
    @ zauber777
    @zauber777
    Lass mal das Leerzeichen zwischen dem "@" und dem darauf folgenden Usernamen weg.
    Und:
    Nimm die Registry-Klasse von .NET.
    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!
    @zauber777 Nächster Punkt: Durch die unterschiedlichen Registry-Zugriffsbefehle kommst Du wahrscheinlich auch woanders in der Registry raus. Durchsuch mal Deine Registry nach Wert "Con-Tool". Abhängig davon, an welchem Computer ich arbeite, komme ich nämlich trotz der Angabe Registry.LocalMachine.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True) bei HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432NODE\Microsoft\Windows\CurrentVersion\Run raus. Eine einheitliche Verwendung von My.Computer.Registry.GetValue und My.Computer.Registry.SetValue behebt zumindest dieses Problem, da die dort angeforderten Keys auch die sind, die Du in VB erhältst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    zauber777 schrieb:

    Die IF-Abfrage soll abfragen, ob in der Registry unter "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" mein Programm names "Con-Tool" eingetragen ist oder nicht.

    Guck dir mal String.IsNullOrEmpty an.