Sleva na školení Naučit se HTML & CSS, JS a Bootstrap
Získej 500 Kč na naše školení. Více zde
Probíhá výprodej HTML & CSS, JavaScript a Bootstrap

Spouštění programů po startu v C#

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Jistě vás napadlo, že by bylo hustodémonsky­megapří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í/odstra­ně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č :D 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:\.....\Muj­Program.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ženo 498x (39.63 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

 

Článek pro vás napsal David Jančík
Avatar
Jak se ti líbí článek?
10 hlasů
Autor je vášnivý programátor a vizionář. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.
Předchozí článek
TCP připojení v C# .NET
Všechny články v sekci
C# - Pro pokročilé
Miniatura
Následující článek
Posílání SMS v C#
Aktivity (1)

 

 

Komentáře
Zobrazit starší komentáře (5)

Avatar
Luboš Běhounek Satik
Autoredaktor
Avatar
Luboš Běhounek Satik:4.2.2013 15:15

Místo do HKEY_CURRENT_USER musíš zapisovat do HKEY_LOCAL_MACHINE.
A musíš samozřejmě u programu mít práva na zápis do těchto míst.

Odpovědět  +1 4.2.2013 15:15
https://www.facebook.com/peasantsandcastles/
Avatar
Mediel
Redaktor
Avatar
Odpovídá na Luboš Běhounek Satik
Mediel:4.2.2013 15:30

To zas dela problem, ze se program musi spustit jako administrator... Lze tedy nejak nastavit spousteni aplikace, aby se sama spoustela jako administrator?

Odpovědět 4.2.2013 15:30
Nechci vám ukazovat, jak dobrý jsem já ... Chci vám ukázat, jak dobrý můžete být vy ... Když uvěříte ... V sami sebe...
Avatar
Luboš Běhounek Satik
Autoredaktor
Avatar
Odpovídá na Mediel
Luboš Běhounek Satik:4.2.2013 15:45

Manifest - do projektu přidej soubor manifestu a hodnotu u

<requestedExecutionLevel>

změň na

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Odpovědět  +2 4.2.2013 15:45
https://www.facebook.com/peasantsandcastles/
Avatar
Mediel
Redaktor
Avatar
Odpovědět 4.2.2013 16:30
Nechci vám ukazovat, jak dobrý jsem já ... Chci vám ukázat, jak dobrý můžete být vy ... Když uvěříte ... V sami sebe...
Avatar
Petr Čech
Redaktor
Avatar
Petr Čech:15.9.2014 17:58

Nějak se mi nespouští. V registrech tu hodnotu mám. :( Vadí, že je to jen debug verze a má trochu pozměněné Main(string[] args) ? Je to WPF aplikace.

Editováno 15.9.2014 17:59
Odpovědět  -1 15.9.2014 17:58
the cake is a lie
Avatar
Člen
Člen
Avatar
Člen:2.11.2014 17:10

Pekný článok :)

Odpovědět 2.11.2014 17:10
...
Avatar
FiftypiSoftware:23. ledna 1:05

Také se mi ta aplikace nespouští po startu, přitom v registech to je....:/

 
Odpovědět 23. ledna 1:05
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na FiftypiSoftware
Martin Dráb:23. ledna 21:19

Pokud aplikaci zapisuješ do HKEY_LOCAL_MAC­HINE, spouští se myslím ještě před přihlášením uživatele. Nevím, zda-li problém spíš není v tom, že nemůžeš vidět její GUI (protože je na jiném desktopu), nebo se nemohou inicializovat všechny její závislosti, protože mnoho věcí ještě není nastartovaných.

Odpovědět 23. ledna 21:19
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Martin Dráb
FiftypiSoftware:24. ledna 0:52

aplikace je zapsána do HKEY_CURRENT_USER
Ale problém už jsem vyřešil. Z nějakého důvodu se aplikace nechtěla spouštět, když její cesta vedla přes Debug nebo přes Release. Prostě, když byla v původním adresáři, kde jsem ji sestavil, nespustila se. Když jsem ji však zkopíroval na plochu nebo ji dal do kořenového adresáře druhého disku (na kterém mám data...Možná to byla prostě příliš dlouhá cesta..?), spustila se bez problému.

 
Odpovědět 24. ledna 0:52
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na FiftypiSoftware
Martin Dráb:24. ledna 7:52

Problémy jsou, když se celý název souboru (tedy i s cestou) blíží svojí délkou k 260 znakům. Ale to si myslím, že bys měl i jiné problémy.

Odpovědět 24. ledna 7:52
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 15. Zobrazit vše