Programm automatisch ausführen

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von BlueSoftware.

    Programm automatisch ausführen

    Moin Leute

    Ich habe ein Programm geschrieben. Und nun möchte ich, dass beim ersten Start gefragt wird, ob das Programm beim Systemstart automatisch auch starten soll.
    Kann mir jemand sagen wie ich das (am einfachsten) realisieren kann?

    LG Luca
    Du machst ne Abfrage rein und dann setzt du entsprechend Keys in der Registry.

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    @Nikx du würdest also mit der Registry arbeiten? Weisst du da gerade zufällig welche Keys oder kannst mir ein Stichwort nennen?
    Ich habe es mal mit der Aufgabenplanung versucht, das ist eine einzige Katastrophe.. Und unendlich viel Code..

    EDIT: Keys gefunden, aber funktionieren nicht:

    Quellcode

    1. Dim regKey As Microsoft.Win32.RegistryKey
    2. regKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True)
    3. regKey.SetValue("xyz", "asdf")

    funktioniert irgendwie nicht...

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „0luca0“ ()

    WAS funktioniert nicht? Welche Werte hast du eingesetzt?

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

    0luca0 schrieb:

    Quellcode

    1. Dim regKey As Microsoft.Win32.RegistryKey
    2. regKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True)
    3. regKey.SetValue("xyz", "asdf")

    funktioniert irgendwie nicht...

    Mit diesem Schlüssel funktioniert das auch nicht. (HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run)

    VB.NET-Quellcode

    1. Microsoft.Win32.Registry.SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run", "MyProgram", "C:\Desktop\WindowsApplication.exe", Microsoft.Win32.RegistryValueKind.String)


    Fakiz schrieb:

    Richtig wäre die Methode CreateSubKey().

    Wenn man ein Autostart-Programm in die Registrierungsdatenbank eintragen will, muss man aber SetValue verwenden, weil alle Programme im bestehenden Schlüssel "Run" aufgelistet sind.
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford

    Quellcode

    1. Microsoft.Win32.Registry.SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run", "Pinger", """" & IO.Directory.GetDirectoryRoot(Application.StartupPath) & "\ProgramData\pinger.exe" & """", Microsoft.Win32.RegistryValueKind.String)​

    Damit läuft es nicht richtig.. Er gibt mir als Wert "C:\ProgramData\" aus anstatt "C:\ProgramData\pinger.exe" Hat jemand ne ahnung wieso?
    Wie lässt Du es Dir den ausgeben?


    Das "IO.Directory.GetDirectoryRoot" brauchst Du doch gar nicht:

    VB.NET-Quellcode

    1. Microsoft.Win32.Registry.SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run", "Pinger", """" & Application.StartupPath &"\pinger.exe" & """", Microsoft.Win32.RegistryValueKind.String)
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford
    Ich nutze für sowas mal folgendes:

    VB.NET-Quellcode

    1. Friend Reg As Microsoft.Win32.RegistryKey
    2. Public Property AutoStart() As Boolean
    3. Get
    4. Reg = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True)
    5. Dim O = Reg.GetValue(My.Application.Info.ProductName, "")
    6. If O Is Nothing OrElse O.ToString.Length = 0 OrElse O.ToString <> Application.ExecutablePath Then
    7. Return False
    8. Else
    9. Return True
    10. End If
    11. End Get
    12. Set(ByVal value As Boolean)
    13. If value = True Then
    14. Reg = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True)
    15. Reg.SetValue(My.Application.Info.ProductName, Application.ExecutablePath)
    16. Else
    17. Reg = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run", True)
    18. Reg.SetValue(My.Application.Info.ProductName, "")
    19. End If
    20. End Set
    21. End Property


    Dann kannst mit

    VB.NET-Quellcode

    1. If Autostart then...

    drauf zugreifen... Und mit

    VB.NET-Quellcode

    1. Autostart = True

    den Wert setzen.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

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

    Das stimmt.
    Wobei ich die Art es über ne Property zu steuern ganz angenehm finde.
    Ob man die im Bedarfsfall anpasst, darüber lässt sich streiten.

    EDIT:
    Könnt man nicht auch einfach in die Windows Autostrart ne Verknüpfung schmeißen und gut ist?
    Also so ohne Registrierung?

    EDIT2:
    Über den Autostart-Ornder würde es dann so funktionieren:
    Spoiler anzeigen
    Den Verweis hinzufügen:

    Für den Aufruf dann auch über die Property folgenden Code hinterlegen:

    VB.NET-Quellcode

    1. Public Function CreateShortcut(ByVal sLinkFile As String, _
    2. ByVal sTargetFile As String, _
    3. Optional ByVal sArguments As String = "", _
    4. Optional ByVal sDescription As String = "", _
    5. Optional ByVal sWorkingDir As String = "") As Boolean
    6. Try
    7. Dim oShell As New Shell32.Shell
    8. Dim oFolder As Shell32.Folder
    9. Dim oLink As Shell32.ShellLinkObject
    10. ' Ordner und Dateinamen extrahieren
    11. Dim sPath As String = sLinkFile.Substring(0, sLinkFile.LastIndexOf("\"))
    12. Dim sFile As String = sLinkFile.Substring(sLinkFile.LastIndexOf("\") + 1)
    13. ' Wichtig! Link-Datei erstellen (0 Bytes)
    14. Dim F = FreeFile()
    15. FileOpen(F, sLinkFile, OpenMode.Output)
    16. FileClose(F)
    17. oFolder = oShell.NameSpace(sPath)
    18. oLink = DirectCast(oFolder.Items.Item(sFile).GetLink, Shell32.ShellLinkObject)
    19. ' Eigenschaften der Verknüpfung
    20. With oLink
    21. If sArguments.Length > 0 Then .Arguments = sArguments
    22. If sDescription.Length > 0 Then .Description = sDescription
    23. If sWorkingDir.Length > 0 Then .WorkingDirectory = sWorkingDir
    24. .Path = sTargetFile
    25. ' Verknüpfung speichern
    26. .Save()
    27. End With
    28. ' Objekte zerstören
    29. oLink = Nothing
    30. oFolder = Nothing
    31. oShell = Nothing
    32. Return True
    33. Catch ex As Exception
    34. ' Fehler! ggf. Link-Datei löschen, falls bereit erstellt
    35. If System.IO.File.Exists(sLinkFile) Then Kill(sLinkFile)
    36. Return False
    37. End Try
    38. End Function
    39. Public Property AutoStart() As Boolean
    40. Get
    41. Dim fi As New System.IO.FileInfo(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup), My.Application.Info.ProductName & ".lnk"))
    42. Return fi.Exists
    43. End Get
    44. Set(ByVal value As Boolean)
    45. If value = True Then
    46. CreateShortcut(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup), My.Application.Info.ProductName & ".lnk"),
    47. Application.ExecutablePath)
    48. Else
    49. Dim fi As New System.IO.FileInfo(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup), My.Application.Info.ProductName & ".lnk"))
    50. If fi.Exists Then fi.Delete()
    51. End If
    52. End Set
    53. End Property​
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MemoAnMichSelbst“ ()

    habe mal dei Registry analysiert und ein paar weitere Einträge in anderen Zweigen gefunden.. anscheinend wurden sie an ein paar andere Orte automatisch dupliziert. Alles entfernt und den Code nochmals ausgeführt und alles hat geklappt.
    Zur Frage wieso ich

    Quellcode

    1. IO.Directory.GetDirectoryRoot(Application.StartupPath) & "\ProgramData\pinger.exe"
    benutze: Das Programm verschiebt sich und wird dann neugestartet unter diesem Pfad. : :)
    Ich danke euch! Gemeinsam zu Lösung :thumbsup:
    Ich würde dir trotzdem empfehlen es über den Autostartordner zu machen.
    Ich sehe es nicht gerne wenn ein Programm nervige Einträge in der Reg macht.

    Wenn dein Programm sich verschiebt, dann kannst du doch auch den Pfad angeben oder nicht?

    MfG,
    Moritz