C# - Éppen futó alkalmazáspéldányok számának meghatározása

forráskód letöltése
Előfordulhat, hogy valamilyen felhasználó által preferált okból szükség van arra, hogy az éppen indított alkalmazás csak egy példányban induljon el, minden más programpéldány futtatása váljon lehetetlenné. Cikkünkben bemutatjuk, hogy az éppen futó Windows-os alkalmazás hogyan képes ellenőrizni, hogy van-e már indított példány, vagy nincs.
A probléma igen egyszerűen megoldható, hiszen rendelkezésünkre áll a System.Diagnostics névtérben egy Process nevezetű osztály, melynek statikus metódusaival lehetővé válik, hogy programok indítása előtt meghatározzunk, az adott néven vagy azonosítóval van-e már futó process a számítógépen.
A meghatározáshoz a GetProcessesByName statikus metódust használhatjuk fel, melynek a példában használt változata a következő deklarációval bír:
GetProcessesByName
Osztály: Precess
public static Process[] GetProcessesByName(
string processName
);
Visszaad egy Process osztályú objektumokat tartalmazó tömböt, melyben megtalálható valamennyi, az adott néven elindított folyamat. Amennyiben olyan nevet adunk meg, mely nem található a futó process-ek nyilvántartásában, a tömb üres lesz. Amennyiben üres karakterláncot adunk át paraméterként, akkor megkapjuk a számítógépen futó valamennyi process objektumát a visszaadott tömbben.
Paraméterek
string processName
A kérdéses process neve, mely egyben az assembly nevét jelenti (az .exe állomány neve), a kiterjesztés nélkül megadva.
Visszatérési érték
A Process objektumok tömbje.
A metódus másik változata kiegészül még egy paraméterrel:
GetProcessesByName
Osztály: Precess
public static Process[] GetProcessesByName(
string processName,
string machineName
);
A visszaadott tömböt adott számítógépre specifikálhatjuk, azaz egy LAN meghatározott számítógépén kaphatjuk meg a futó process-ek listáját. A processName paraméterként itt megadhatunk üres karakterláncot. A lokális számítógép információit úgy kaphatjuk meg, ha a második paraméterként egy pontot adunk meg (’.’).
Paraméterek
string processName
A keresett process neve.
string machineName
A számítógép neve, melyen a futó process-ek listáját le akarjuk kérdezni.
Visszatérési érték
A futó process-ek listáját tartalmazó tömb.
A mellékelt példában egy kis kódolás árán megvalósíthatjuk a lekérdezést, mely alapján dönt a program arról, hogy elindul-e vagy sem.
A program Main függvényébe tesszük a szükséges kódsorokat:
[STAThread]
static void Main() 
{
  Process[] pList = Process.GetProcessesByName("CheckInstance");
A lista ellenőrzése után, ha abban van már egy ilyen elem, akkor kilépünk a függvényből, még mielőtt az alkalmazás elkezdene futni.
  if (pList.Length != 1)
  {
    MessageBox.Show("Az alkalmazás már fut egy példányban. Újab példány indítása nem lehetséges!","Hiba",MessageBoxButtons.OK,MessageBoxIcon.Error);
    return;
  }
  ...
}
A Form-on található gombbal futás közben is elindíthatunk egy másik példányt, mely azonban nem indul már el.