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ę:
1 2 3 4 |
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
1 2 3 4 5 6 7 8 |
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:
1 2 3 4 5 6 7 8 9 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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:
1 2 3 4 5 |
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:
1 2 3 4 5 |
Imports Microsoft.Win32 Public Class Form1 (...) |
Następnie tworzymy uchwyt do formy i wypełniamy ją kodem:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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:
1 2 3 4 5 6 7 8 9 |
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:
1 2 3 4 5 6 7 8 9 |
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