Neustart nach Neustart

Wolfgang Kluge
wolfgang@vbwelt.de

Ist bestimmt schon jedem mal aufgefallen. Bestimmte Programme, und zu den Vorreitern gehört da eben der Explorer, die beim Beenden von Windows noch offen waren, werden nach dem Neustart wieder geöffnet.
Auch viele Installationsprogramme (unter anderem auch daß, das Visual Studio installiert, bzw. 'last not least' das Windows-Installationsprogramm) brauchen zwischendurch einen Neustart, um weitere Dateien auf die heimiasche Festplatte kopieren zu können.
All diese Programme machen sich an der Registry zu schaffen. Dort gibt es nämlich den wunderbaren Key RunOnce, der nach erfolgtem Run auch schon wieder gelöscht wird.

Um nun das eigene Programm dorthin zu bringen, ist nichts weiter nötig, als den entsprechenden Wert dort Einzutragen.

 Deklaration:
Private Const HKEY_CURRENT_USER = &H80000001
Private Const REG_SZ = 1 ' Unicode nul terminated string
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey 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 Any, ByVal cbData As Long) As Long ' Note that if you declare the lpData parameter as String, you must pass it By Value.


Um nun den Wert dort nur Einzutragen, wenn das Programm durch Windows beenden geschlossen wird(ansonsten würde auch der Autostart-Ordner genügen), fragt man im Form_QueryUnload-Ereigniss ab, wie die Form geschlossen wurde.
Bei besagtem Fall wird UnloadMode zu vbAppWindows(=2)

' Am besten im Ereigniss Form_QueryUnload aufrufen.
' dort kann man abfragen, ob Form durch 'Windows beenden' geschlossen wurde
Dim hk As Long, rc As String
rc = App.Path & "\" & App.EXEName & ".EXE"
RegCreateKey HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\RunOnce", hk
RegSetValueEx hk, App.Title, 0, REG_SZ, ByVal rc, Len(rc) + 1