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

C# .NET Pro pokročilé Spouštění programů po startu v C#

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 455x (39.63 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (1)

Článek pro vás napsal David Jančík [sczdavos]
Avatar
Autor je vášnivý programátor v .NET C# a PHP. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.

Jak se ti líbí článek?
Celkem (10 hlasů) :
4.24.24.24.2 4.2


 


Miniatura
Předchozí článek
TCP připojení v C# .NET
Miniatura
Všechny články v sekci
C# - Pro pokročilé
Miniatura
Následující článek
Posílání SMS v C#

 

 

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

Avatar
David Jančík [sczdavos]:

Ahoj, moc nerozumím dotazu? Zapisuješ do %appdata%? Tam by se zapisovacími právy neměl být problém. Jinak se vytvoří manifest a tam se vyžádají administrátorská práva, pokud chceš zapisovat někam jinam viz: http://www.itnetwork.cz/…fe4d8d6c9915#…

Odpovědět 6.12.2012 17:52
Čím více času dostaneš, tím méně ho máš.
Avatar
Michael Olšavský:

Diky potreboval jsem to druhy. Pri zapisech do registru mi to totiz porad pise, ze nemam dostatecna prava.

 
Odpovědět 6.12.2012 18:09
Avatar
matesax
Redaktor
Avatar
Odpovídá na Michael Olšavský
matesax:

Záleží na tom, kam přistupuješ - kdyby na custom user, tak není problém...

 
Odpovědět 6.12.2012 18:13
Avatar
Mediel
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
Mediel:

Zdravim, tohle je skvele, pouzivam to uz nejaky ten mesic, ale co se mi nepovedlo vygooglit je, jak aby se to spoustelo vsem uzivatelum, ne jen tomu, ktery si to v "zahackuje" tedy aby to nebylo lokalni pro jednoho uzivatele, ale globalni pro vsechny uzivatele...

Odpovědět 4.2.2013 14:21
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
Odpovídá na Mediel
Luboš Běhounek (Satik):

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
:)
Avatar
Mediel
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Mediel:

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
Odpovídá na Mediel
Luboš Běhounek (Satik):

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
:)
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 (czubehead):

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 15.9.2014 17:58
Why so serious? -Joker
Avatar
Člen
Člen
Avatar
Člen:

Pekný článok :)

Odpovědět 2.11.2014 17:10
...
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 11. Zobrazit vše