Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0028: Anwendung nach Neustart automatisch starten

 von 

Beschreibung 

Wenn Sie Windows herunterfahren und vorab der Windows- oder Internet-Explorer geöffnet und nicht geschlossen war, dann laden sich diese Programme nach dem Neustart automatisch. Dies funktioniert über einen entsprechend dafür vorgesehenen Eintrag in der Registry. Dieses Prinzip lässt sich auch mit VB-Anwendungen bewerkstelligen. Der folgende Source beinhaltet ein ausführliches Beispiel zu diesem Thema.

Dieser Tipp funktioniert entweder nur in kompilierter Form oder benötigt eine DLL/OCX-Datei. Diese Binärdateien sind dem Tipp hinzugefügt worden, um seinen Funktionsumfang darstellen zu können. Vor dem Upload wurden sie auf Viren geprüft.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

RegCloseKey, RegCreateKeyA (RegCreateKey), RegDeleteValueA (RegDeleteValue), RegOpenKeyExA (RegOpenKeyEx), RegSetValueExA (RegSetValueEx)

Download:

Download des Beispielprojektes [8,65 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Schaltfläche "Command2"
' Steuerelement: Rahmensteuerelement "Frame1"
' Steuerelement: Optionsfeld-Steuerelement "Option1" (Index von 0 bis 3) auf Frame1
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Beschriftungsfeld "Label1"


'Achtung : Das Programm funktioniert nicht in der Ent-
'          wicklungsumgebung. Um es auszuprobieren be-
'          nutzen Sie die beigefügte .exe Datei oder
'          kompilieren diesen Source

Option Explicit

Private Declare Function RegOpenKeyEx Lib "advapi32.dll" _
        Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal _
        lpSubKey As String, ByVal ulOptions As Long, ByVal _
        samDesired As Long, phkResult As Long) As Long

Private Declare Function RegCreateKey Lib "advapi32.dll" _
        Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal _
        lpSubKey As String, phkResult As Long) As Long
        
Private Declare Function RegSetValueEx Lib "advapi32.dll" _
        Alias "RegSetValueExA" (ByVal hKey As Long, ByVal _
        lpValueName As String, ByVal Reserved As Long, _
        ByVal dwType As Long, lpData As Long, ByVal cbData _
        As Long) As Long
        
Private Declare Function RegCloseKey Lib "advapi32.dll" _
        (ByVal hKey As Long) As Long

Private Declare Function RegDeleteValue Lib "advapi32.dll" _
        Alias "RegDeleteValueA" (ByVal hKey As Long, _
        ByVal lpValueName As String) As Long
        
Const HKEY_CLASSES_ROOT As Long = &H80000000
Const HKEY_CURRENT_USER As Long = &H80000001
Const HKEY_LOCAL_MACHINE As Long = &H80000002
Const HKEY_USERS As Long = &H80000003
Const HKEY_PERFORMANCE_DATA As Long = &H80000004
Const HKEY_CURRENT_CONFIG As Long = &H80000005
Const HKEY_DYN_DATA As Long = &H80000006

Const KEY_QUERY_VALUE As Long = &H1&
Const KEY_SET_VALUE As Long = &H2&
Const KEY_CREATE_SUB_KEY As Long = &H4&
Const KEY_ENUMERATE_SUB_KEYS As Long = &H8&
Const KEY_NOTIFY As Long = &H10&
Const KEY_CREATE_LINK As Long = &H20&
Const KEY_READ As Long = KEY_QUERY_VALUE Or _
    KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY
                 
Const KEY_ALL_ACCESS As Long = KEY_QUERY_VALUE Or _
    KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or _
    KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or _
    KEY_CREATE_LINK
    
Const ERROR_SUCCESS As Long = 0&

Const REG_NONE As Long = 0&
Const REG_SZ As Long = 1&
Const REG_EXPAND_SZ As Long = 2&
Const REG_BINARY As Long = 3&
Const REG_DWORD As Long = 4&
Const REG_DWORD_LITTLE_ENDIAN As Long = 4&
Const REG_DWORD_BIG_ENDIAN As Long = 5&
Const REG_LINK As Long = 6&
Const REG_MULTI_SZ As Long = 7&

Const REG_OPTION_NON_VOLATILE As Long = &H0&

Private Sub Command1_Click()
    Unload Me
End Sub

Private Sub Command2_Click()
    ' Beenden, keine Einträge in die Registry,
    ' um das Programm beim nächsten Reboot wieder zu
    ' starten!
    ' Löschen der Registrysettings!
    Dim mvalue
    Dim Result As Long
    Dim hKey As Long
    Dim Root As Long
    Dim Key As String
    
    'Root = HKEY_LOCAL_MACHINE 'Konstante...
    Root = HKEY_CURRENT_USER 'auch möglich
    
    Key = "Software\Microsoft\Windows\CurrentVersion\RunOnce"
    
    ' unser Beispieleintrag lautete "MyApp"
    mvalue = "MyApp"
    
    Result = RegOpenKeyEx(Root, Key, 0, KEY_ALL_ACCESS, hKey)
    If Result = ERROR_SUCCESS Then
        Result = RegDeleteValue(hKey, mvalue)
        Result = RegCloseKey(hKey)
    End If
    
    Unload Me
End Sub

Private Sub Form_Load()
    Command1.Caption = "Beenden über Code"
    Command2.Caption = "Ende + DeleteKey!"
    Option1(0).Caption = "Bei Neustart laden, wenn über Systemmenü beendet wurde"
    Option1(1).Caption = "Bei Neustart laden, wenn durch Code beendet [Button unten]"
    Option1(2).Caption = "Bei Neustart laden, wenn Windows Sitzung beendet wurde"
    Option1(3).Caption = "Bei Neustart laden, wenn durch den Taskmanager beendet"
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
'### Bedeutung des Werteinhalts der Variablen 'UnlodeMode'
'    UnloadMode = vbFormControlMenu [0]  Schließen aus dem Systemmenü
'    UnloadMode = vbFormCode        [1]  Unload über Code aufgerufen.
'    UnloadMode = vbAppWindows      [2]  Windows wird beendet
'    UnloadMode = vbAppTaskManager  [3]  Beenden durch Task-Manager
'    UnloadMode = vbFormMDIForm     [4]  MDI-Formular wird geschlossen
  
    Dim Path As String, Slash As String
    Dim Key As Long
    Dim X As Integer

    '### Abfragen welche Bedingung ein Laden nach dem Neustart erlaubt
    For X = 0 To 3
        If Option1(X).Value = True Then Exit For
    Next X
  
    If UnloadMode = X Then
        If Right$(App.Path, 1) <> "\" Then Slash = "\"
        Path = App.Path & Slash & App.EXEName & ".EXE"
      
        Call RegCreateKey(HKEY_CURRENT_USER, _
            "Software\Microsoft\Windows\CurrentVersion\RunOnce", Key)
        
        Call RegSetValueEx(Key, "MyApp", 0&, REG_SZ, VarPtr(Path), _
            Len(Path) + 1)
        
        Call RegCloseKey(Key)
    End If
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 8 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Max am 27.03.2005 um 16:12

Des is ja ganz schön, aber ich brauch ein script das sich selbst nach dem hochfahren startet, egal wie beendet wurde!
(für win xp) kennt da jemand was??

Kommentar von Fabius am 15.12.2002 um 18:08

Ich finde keinen key run services.
Gibt's den vielleicht nur unter WinME?

Kommentar von IVHP am 07.08.2002 um 19:39

der key: run services statt run. alle dort stehenden programme wird vor dem einloggen gestartet.

Kommentar von Mucke, Klaus am 01.06.2002 um 21:43

Toll, leider geht das erst nach dem Einloggen, Jemand eine Idee wie PC-Anywhere das macht ?

Kommentar von vbcoder am 13.01.2002 um 13:49

Bei ME:
Software\Microsoft\Windows\CurrentVersion\Run

Kommentar von mad am 01.12.2001 um 19:22

bei WinME funzt es nicht. (bei WinXP tuts)
gibt es für ME eine lösung, die mindestens genauso elegant ist?

Kommentar von Peter Iwanowitsch am 22.08.2001 um 13:23

Ehm ich glaube die Überschrift ist nicht so treffend, ansonsten danke :)
Fehler in der Überschrift:
nicht Neutsart sondern NEUSTART :)
Ansonten weiter so !

Kommentar von Tobias am 21.04.2001 um 17:11

Kann es sein das es bei Win ME nicht geht?