Pokażę wam jak zrobić aby nasza aplikacja włączała się wraz ze startem windowsa. Często gdy projektujemy jakiś widget, program sprawdzający jakieś czujniki komputera albo programy do tworzenia kopii bezpieczeństwa chcemy aby działał bez ingerencji użytkownika. Aby tego dokonać mamy kilka możliwości.
- Dodać skrót do pliku *.exe naszej aplikacji do specjalnego folderu „autostartu” w Windowsie
- Dodać klucz programu do rejestru w odpowiednim miejscu
Zarówno pierwsza opcja ma swoje plusy jak i minusy. Minusem dla pierwszej opcji jest to, że użytkownik ma możliwość usunięcia z autostartu naszą aplikacje ręcznie. To znaczy, że przyciska Start>Wszystkie programy>Autostart i usuwa nasz skrót. Każdy średnio zaawansowany użytkownik jest wstanie to zrobić. Plusem jest na pewno jawność która daje użytkownikowi pewien rodzaj bezpieczeństwa. Drugi sposób jest trochę bardziej dla użytkownika podejrzany dodawanie klucza do rejestru wiąże się z pewną podejrzliwością użytkownika i nasza aplikacja może mieć przypiętą łatkę wirusa albo spywara.
Zaczniemy od sposobu pierwszego. Zrobiłem sobie prosty program składający się z dwóch przycisków i formy:
Program ma dwa przyciski jednym będziemy dodawać a drugim usuwać nasz skrót. Najpierw zrobimy sobie uchwyt do Form1. Musimy dodać tylko odwołanie do biblioteki i możemy przystępować do działania. Klikamy prawym przyciskiem myszki na nasz projekt i wybieramy „Dodaj odwołanie…”
Następnie w „COM” znajdujemy:
Dajemy fajeczkę i wciskamy „Ok” teraz w kodzie naszego programu importujemy bibliotekę:
Imports IWshRuntimeLibrary Public Class Form1 (...)
Teraz dodamy sobie zmienne poniżej „Public Class Form1” będziemy się do niech odwoływać zarówno podczas przyciskania klawiszy jak i startu programu dlatego warto aby były dostępne dla tych obiektów
Imports IWshRuntimeLibrary
Public Class Form1
Shadows location As String = Application.ExecutablePath
Dim ProgramName As String = System.IO.Path.GetFileNameWithoutExtension(location)
(...)
Przyciskamy dwukrotnie na formę i powinno nas przenieść do kodu programu jeśli nie sami tam przechodzimy i wklejamy kod:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
If System.IO.File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.Startup) & "\" & ProgramName & ".lnk") Then
Button1.Enabled = False
Button2.Enabled = True
Else
Button1.Enabled = True
Button2.Enabled = False
End If
End Sub
Kod ten podczas ładowania programu sprawdzi czy skrót już istnieje, jeśli tak da nam możliwość jego usunięcia ale nie ma potrzeby tworzyć drugiego więc zablokuje nam przycisk tworzący skrót i analogicznie jeśli skrót nie istnieje zablokuje klawisz do jego usuwania. Teraz przejdźmy do tworzenia skrótu, tworzymy uchwyt do przycisku „Dodaj” i wypełniamy go kodem:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim WshShell As New WshShell
Dim skrot As IWshRuntimeLibrary.IWshShortcut
skrot = CType(WshShell.CreateShortcut(Environment.GetFolderPath(Environment.SpecialFolder.Startup) & "\" & ProgramName & ".lnk"), IWshRuntimeLibrary.IWshShortcut)
With skrot
.TargetPath = Application.ExecutablePath
.WindowStyle = 1
.IconLocation = Application.ExecutablePath & ",0"
.Save()
End With
Button1.Enabled = False
Button2.Enabled = True
End Sub
Przechodzimy teraz do przycisku kasującego skrót. Tutaj za dużej filozofii nie ma:
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
System.IO.File.Delete(Environment.GetFolderPath(Environment.SpecialFolder.Startup) & "\" & ProgramName & ".lnk")
Button1.Enabled = True
Button2.Enabled = False
End Sub
Jak widzimy powyżej nie było takie trudne. Efekt wygląda tak:
Projekt do pobrania pobieramy tutaj: autostart_skrot
Teraz zajmiemy się rejestrem. Dodawanie wątku do rejestru będzie dużo łatwiejsze niż tworzenie skrótu w autostarcie. Tworzymy sobie podobny projekt:
W działaniu będzie identyczny. Najpierw sprawdza czy istnieje klucz następnie blokujemy odpowiednie przyciski i dajemy użytkownikowi możliwość dodanie/usunięcia wpisu. Zaczynamy od importu biblioteki:
Imports Microsoft.Win32 Public Class Form1 (...)
Następnie tworzymy uchwyt do formy i wypełniamy ją kodem:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
Dim regKey As Microsoft.Win32.RegistryKey
regKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True)
If regKey.GetValue(Application.ProductName) Is Nothing Then
Button1.Enabled = True
Button2.Enabled = False
Else
Button1.Enabled = False
Button2.Enabled = True
End If
regKey.Close()
Catch ex As Exception
MsgBox("Błąd:" & ex.ToString)
End Try
End Sub
Następnie dodajemy działania przycisków:
Dodawania:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim regKey As Microsoft.Win32.RegistryKey
regKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True)
regKey.SetValue(Application.ProductName, Application.ExecutablePath)
regKey.Close()
Button1.Enabled = False
Button2.Enabled = True
End Sub
Usuwania:
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim regKey As Microsoft.Win32.RegistryKey
regKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True)
regKey.DeleteValue(Application.ProductName)
regKey.Close()
Button1.Enabled = True
Button2.Enabled = False
End Sub
Wszystko powinno działać. Wygląda to tak:
Cały projekt dostępny tutaj: autostart_rejestr







