Memik Yanık - Kişisel Web Sitesi Ana Sayfa | Hakkımda | Kitap Önerileri | Fotoğraflarım | RSS RSS | İletişim

Ayni Programın 2. Kez Çalıştırılmasını Engellemek - C#


Bazen kullanıcı program çalıştırmaya yarayan kısayolun üzerinde çift tıklama yapar. Hemen tepki alamadığında sanki tıklama yapmamış gibi 2. kez tıklama yapabilir. Bu durumda aynı program 2 kez çalıştırılır. Bu gibi sorunların önüne geçmek veya C# ile hazırladığınız programın aynı oturumda 2. kez çalıştırılmasını önlemek istiyorsanız Windows’un GlobalAddAtom(), GlobalFindAtom() ve GlobalDeleteAtom() fonksiyonunlarında yararlanabilirsiniz. Bu fonksiyonların C#’a uyarlanmış yapılarını aşağıda görebilirsiniz.

 

[DllImport("kernel32.dll")]

static extern ushort GlobalAddAtom(string lpString);

 

[DllImport("kernel32.dll")]

static extern ushort GlobalFindAtom(string lpString);

 

[DllImport("kernel32.dll")]

static extern ushort GlobalDeleteAtom(ushort atom);


Tahmin edebileceğiniz Windows'un API adı verilen fonksiyonları .NET Framework ile gelen DLLImport adlı nitelikten yararlanılarak C# uygulamaları dahilinde kullanılmaktadır. Fonksiyonları bu şekilde deklare ettikten sonra projenin ilk formunun Load olayını temsil eden metodu aşağıdaki gibi düzenledim.

 

  private void Form1_Load(object sender, EventArgs e)

    {

       string str = Application.ProductName + Application.ProductVersion;    

       ushort atom = GlobalFindAtom(str);

        if (atom > 0)
           {

               MessageBox.Show("Bu program zaten çalışıyor");
              Application.Exit();
           }

        else

            atom = GlobalAddAtom(str);

      }

 

Bu kodda önce GlobalFindAtom() fonksiyonu ile söz konusu programın daha önce çalıştırılıp çalıştırılmadığı araştırılıyor. Program veya proje daha önce çalıştırılmadıysa GlobalFindAtom() geriye 0 göndereceğinden programın çalışması engellenmez. Bu sırada GlobalAddAtom() metodu ile sistem programın çalıştırıldığı konusunda bilgilendirilir.

Ancak bu durumda projenin ana formu yok edilip programın çalışması sona erdirildiğinde sistemin bundan haberdar edilmesi gerekir. Formun Closed olayını temsil eden metotta GlobalDeleteAtom() fonksiyonu kullanılmazsa bu şartlarda Windows tekrar başlatılana kadar aynı program tekrar çalıştırılamaz.

 private void Form1_FormClosed(object sender, FormClosedEventArgs e)

  {

       string str = Application.ProductName + Application.ProductVersion;

       ushort atom = GlobalFindAtom(str);

       GlobalDeleteAtom(atom);      

  }

Bu konuda bilgiyi başka kaynaklarda bulmanız yüksek bir ihtimaldir. Çünkü bu metnin benzerini 3 yıl öncesinde birkaç forumda sorulan soruya cevap olarak verdim. Ayrıca burada yazılanlar tecrübeli programcılar tarafından bilinmedik şeyler değildir.

Forumlardaki Sorular 08.04.2009 21:50:22

2 YORUM


YorumlarYorum Yaz
Ana Sayfa | Hakkımda | Kitap Önerileri | Fotoğraflarım | RSS | İletişim
Memik Yanık 2004-2009 © Tüm Hakları Saklıdır.
Hazırlayan www.semgoksu.com