IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Práca s mutex aneb má aplikácia bude spustená len raz

Ak je nežiaduce, aby sa vaše aplikácie spúšťala viac krát, potom čítajte ďalej.

Mutual exclusion (skrátene mutex) zabraňuje viac násobnému použitie častí, ktoré si neprajem zdieľať. Vytvára sa s nejakým kľúčovým slovkom, najčastejšie pri použití pre náš úkon s názvom aplikácie. Ak už proces s týmto mutex beží, potom sa to po vytvorení inštancie mutex dozvieme.

Používa sa tiež napríklad aj v Inštalátor - nedá prepísať súbory, keď sú používané,

Presuňme sa do súboru Program.cs, kde vytvoríme novú inštanciu mutex:

bool createdNew;
Mutex appMutex = new Mutex(true, Application.ProductName, out createdNew);

Pri vytvorení inštancie mutex je jeho výstupom tiež premenná typu boolean v ktorej je uložená informácia o tom, či už mutex s rovnakým menom existuje alebo sa práve teraz vytvoril.

Teraz nám už nič nebráni v tom si pridať jednoduchú podmienku.

if (createdNew)
    Application.Run(new Form1());
else
    MessageBox.Show("Tato aplikace může být spuštěna pouze jednou!");

Avšak toto, je užívateľsky neprívetivej a lepšie by bolo, keby sa pri ďalšom kľučku na súbor aplikácie zobrazila v popredí.

A preto si vytvoríme triedu Singleinstance

public static class SingleInstance
{
    public const int HWND_BROADCAST = 0xffff;
    public static int WM_SHOWME = RegisterWindowMessage("MOJE_APLIKACE_ZOBRAZ_OKNO");
    [DllImport("user32")]
    public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam);
    [DllImport("user32")]
    public static extern int RegisterWindowMessage(string message);

    public static void ShowForm()
    {
        SingleInstance.PostMessage(
            (IntPtr)SingleInstance.HWND_BROADCAST,
            SingleInstance.WM_SHOWME,
            IntPtr.Zero,
            IntPtr.Zero);
    }
}

Bude nás zaujímať premenná WM_SHOME, ktorá obsahuje kľúč, pomocou ktorého sa v programe potom vykoná daná metóda. Odporúčam teda pokojne sa rozpísať a napísať niečo unikátne. Môžete takto aj ovládať aplikáciu. Ak si vytvoríte viac takých môžete ich potom obdobným spôsobom volať.

Metóda ShowForm vyšle signál v podobe zadné RegisterWindow­Message a ten aplikácie spracuje v danom Formu najčastejšie v tom hlavnom:

protected override void WndProc(ref System.Windows.Forms.Message m)
{
    if (m.Msg == SingleInstance.WM_SHOWME)
    {
        this.Show();
        WindowState = FormWindowState.Normal;
        this.Activate();
    }

    base.WndProc(ref m);
}

Prepíšeme metódu WndProc a pridáme do nej podmienku, ak je príkazom náš príkaz vykonaj zobrazenia okna. Teraz už určite chápete ako primitívne je urobiť si aplikáciu, z ktorej môžete ovládať inú aplikáciu. Je to síce k ničomu, ale pobaví to :)

Do Program.cs teraz len v else zavoláme SingleInstance­.ShowForm ();

C # - Pre pokročilých
Poznámky: Stalo sa mi, že vyššie uvedený spôsob nefungoval. Riešenie môže byť nasledovné: Zavolanie metódy appMutex.ReleaseMutex() pred spustením programu. Avšak aj toto ma sklamalo. Pridal som teda ešte podmienku Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length == 1). Teda pozriem sa, koľko procesov zo rovnakým názvom je spustené. Ak len jeden (ten súčasný), pokračujem, inak zobrazím okno aplikácie.

 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 354x (40.3 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Všetky články v sekcii
C # - Pre pokročilých
Článok pre vás napísal David Jančík
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor je vášnivý programátor. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.
Aktivity