Spúšťanie programov po štarte v C #
Iste vás napadlo, že by bolo hustodémonskymegapřísné, keby sa váš program spúšťal po štarte. Né také to presunie do zložky po spustení ale prívetivý checkbox, ktorý by toto nastavoval.
V registroch regedit.exe
môžete nájsť pod
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
jednotlivé kľúče, ktoré udávajú cestu k spustiteľnému súboru, ktorý
sa má automaticky spustiť po štarte. Nepôjde teda o nič iné než o prácu
s registrami
Vytvoríme si teda nový projekt. A do formulára
vložíme checkbox s nejakým rozumným popiskom a pridáme mu
event CheckedChanged
.
Teraz si vytvoríme triedu RegistryManager
.
Pridáme using Microsoft.Win32;
A deklarujeme
triedny premennú pre prístup k programom spúšťajúcim sa po štarte.
static RegistryKey onStartup = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
Teraz si vytvoríme metódu na nastavenie / odstránenie spúšťania programu po štarte.
using System.Windows.Forms;
public static void SetOnStartup(bool run) { if (run == true) rkApp.SetValue("MojeAplikace", Application.ExecutablePath.ToString()); else rkApp.DeleteValue("MojeAplikace", false); }
Ak je premenná run == true.
Nastaví sa do registrov kľúč s názvom "MojeAplikace" pozn.
možno použiť aj Application.ProductName
, čo vráti názov
aplikácie nastavenia v Properties\AssemblyInfo.cs
.
inak
Túto hodnotu zmaže. Druhý parameter (v našom prípade
false) určuje, či má byť pri chybe v mazaní (kľúč neexistuje) vyhodená
výnimka. Čo my nepotrebujeme.
Teraz do udalosti CheckedChanged
nášho
checkboxu pridáme iba:
RegistryManager.SetOnStartup(runOnStartup.Checked);
Teraz sa zdá byť program hotový. Iste vás ale napadne, ako potom automaticky zaškrtnúť checkbox. Ukladať do súboru by šlo, avšak čo keby užívateľ kľúč z registra zmazal ručne? Preto je lepšie vytvoriť si na to ďalšiu metódu, ktorá sa pozrie či kľúč v registroch existuje.
Pridáme teda ďalšiu metódu do
RegistryManager
niečo ako IsOnStartup. A len jednduše:
return (rkApp.GetValue(Application.ProductName) != null);
Asi vás to len tak netrkne, ale čo sa stane, keď používateľ presunie onen súbor do inej zložky? No vlastěn vôbec nič. A to doslova. Program sa jednoducho nespustí, pretože ho systém na danej lokácii nenájde. Čo sa dá ale jednoducho ošetriť. Vezmeme z registrov tú cestu a pozrieme sa či súbor existuje.
Celá metóda potom bude vyzerať nejako takto:
public static bool IsOnStartup() { if (rkApp.GetValue(Application.ProductName) == null) return false; if (!System.IO.File.Exists(rkApp.GetValue(Application.ProductName).ToString())) rkApp.SetValue(Application.ProductName, Application.ExecutablePath.ToString()); return true; }
No a tú potom jednoducho zavoláme v konstruktoru Formu.
runOnStartup.Checked = RegistryManager.IsOnStartup();
A sme u konca. Teraz si to ideme odskúšať. Som zvedavý, koľko z vás, kvôli tomu reštartuje počítač : D Ja už púšťam Virtual PC, aby som príklad odskúšal (Teraz som vám vnukol nápad)
Ešte pridám menšie vsuvku. A to používanie parametrov. Ak budete chcieť spustiť program napríklad minimalizovaný alebo v tray. Jednoducho do registrov uložte cestu s parametrom napr. "-H" ako hidden. "C: \ ..... \ MujProgram.exe -h"Všimli ste si, že v konstruktoru programu, teda v
Program.cs je štandardne String[] args
? Tak
teraz uvidíte na čo je to dobré
Form1 form = new Form1(); if ((args.Length > 0) && (args[0] == "-h")) { form.WindowState = FormWindowState.Minimized; } Application.Run(form);
Prípadne ak používate TrayIkonu, tak môžete aj
form.ShowInTaskbar = false;
Pokiaľ ju zobrazujete manuálne. Potom
skontrolujte v konstruktoru formu FormWindowState a podľa toho ju zobrazte.
Jednoduché, že?
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 557x (39.63 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#