Spouštění programů po startu v C#
Jistě vás napadlo, že by bylo hustodémonskymegapřísné, kdyby se váš program spouštěl po startu. Né takové to přesunutí do šložky po spuštění ale přívětivý checkbox, který by toto nastavoval.
V registrech regedit.exe
můžete najít pod
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
jednotlivé klíče, které udávají cestu ke spustitelnému souboru, který se
má automaticky spustit po startu. Nepůjde tedy o nic jiného než o práci s
registry
Vytvoříme si tedy nový projekt. A do formuláře
vložíme checkbox s nějakým rozumným popiskem a přidáme
mu event CheckedChanged
.
Nyní si vytvoříme třídu
RegistryManager
.
Přidáme using Microsoft.Win32;
A deklarujeme
třídní proměnnou pro přístup k programům spouštějícím se po
startu.
static RegistryKey onStartup = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
Nyní si vytvoříme metodu na nastavení/odstranění spouštění programu po startu.
using System.Windows.Forms;
public static void SetOnStartup(bool run) { if (run == true) rkApp.SetValue("MojeAplikace", Application.ExecutablePath.ToString()); else rkApp.DeleteValue("MojeAplikace", false); }
Pokud je proměnná run == true.
Nastaví se do registrů klíč s názvem "MojeAplikace" pozn.
lze použít i Application.ProductName
, což vrátí název
aplikace nastavení v Properties\AssemblyInfo.cs
.
Jinak
Tuto hodnotu smaže. Druhý parametr (v našem případě
false) určuje, zda má být při chybě v mazání (klíč neexistuje) vyhozena
vyjímka. Což my nepotřebujeme.
Nyní do události CheckedChanged
našeho
checkboxu přidáme pouze:
RegistryManager.SetOnStartup(runOnStartup.Checked);
Nyní se zdá být program hotov. Jistě vás ale napadne, jak pak automaticky zaškrtnout checkbox. Ukládat do souboru by šlo, ovšem co kdyby uživatel klíč z registru smazal manuálně? Proto je lepší vytvořit si na to další metodu, která se podívá zda klíč v registrech existuje.
Přidáme tedy další metodu do
RegistryManager
něco jako IsOnStartup. A jen jednduše:
return (rkApp.GetValue(Application.ProductName) != null);
Asi vás to jen tak netrkne, ale co se stane, když uživatel přesune onen soubor do jiné složky? No vlastěn vůbec nic. A to doslova. Program se prostě nespustí, protože ho systém na dané lokaci nenajde. Což se dá ale jednoduše ošetřit. Vezmeme z registrů tu cestu a podíváme se zda soubor existuje.
Celá metoda pak bude vypadat nějak 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 tu pak jednoduše zavoláme v konstruktoru Formu.
runOnStartup.Checked = RegistryManager.IsOnStartup();
A jsme u konce. Nyní si to jdeme odzkoušet. Jsem zvědav, kolik z vás, kvůli tomu restartuje počítač Já už pouštím Virtual PC, abych příklad odzkoušel (nyní jsem vám vnuknul nápad)
Ještě přidám menší vsuvku. A to používání parametrů. Pokud budete chtít spustit program například minimalizovaný nebo v tray. Jednoduše do registrů uložte cestu s parametrem např. " -h" jako hidden. "C:\.....\MujProgram.exe -h"
Všimli jste si, že v konstruktoru programu, tedy v
Program.cs je standardně String[] args
? Tak teď
uvidíte k čemu je to dobré
Form1 form = new Form1(); if ((args.Length > 0) && (args[0] == "-h")) { form.WindowState = FormWindowState.Minimized; } Application.Run(form);
Případně pokud používáte TrayIkonu, tak můžete i
form.ShowInTaskbar = false;
Pokud ji zobrazujete manuálně. Pak
zkontrolujte v konstruktoru formu FormWindowState a podle toho ji zobrazte.
Jednoduché, že?
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 571x (39.63 kB)
Aplikace je včetně zdrojových kódů v jazyce C#