API FONKSİYONLARI

Bu yazı  Delphi’nin .NET uyumlu versiyonunu konu ettiğim kitabımın Api fonksiyonları adlı bölümün bir kısmıdır.

 

Bu yazıda Windows’un API fonksiyonlarının bazıları hakkında bilgi verilecektir. API fonksiyonların çoğunluğu Delphi projelerine otomatik olarak dahil edilmeyen Namespace’lerde tanımlı oldukları için bu Namespace’lerin projeye dahil edilmesi gerekiyor.

 

Windows’un bazı API fonksiyonlarını kullanabilmek için Borland.Vcl.Windows, Borland.Vcl.Mapi, Borland.Vcl.ShellApi ve Borland.Vcl.SHFolder gibi namespace’lere gerek duyulmaktadır.

 

 

Konunun devamında anlatılacağı gibi Windows’a ait API fonksiyonları Windows ile gelen bazı DLL dosyaları içinde yer almaktadır. Bu nedenle kullanılmak istenen API fonksiyonun Windows’un hangi DLL dosyasında tanımlı olduğu öğrenilmelidir.

 

Windows’u Kapatmak – ExitWindowsEx() Fonksiyonu

 

Windows yeniden başlatılmak istendiğinde Windows’un ExitWindowsEx() fonksiyonu kullanılmaktadır. Ancak bu fonksiyon kullanılan Windows sürümünden ve Windows’un mevcut ayarlarından etkilenmektedir. Bu nedenle istenilen sonuçlar alınamayabilir.

 

Bildiğiniz gibi .NET Framework ile gelen MessageBox sınıfı System.Windows.Forms adlı Namespace’te tanımlıdır ve bu Namespace projelere otomatik olarak dahil edilmektedir. Ancak API fonksiyonlarını kullanmak üzere koda Borland.Vcl.Windows adlı Namespace’i projeye dahil ettiğinizde derleyici MessageBox sınıfını hangi Namespace’te arayacağına karar veremiyor. Bu nedenle kod dosyasına Borland.Vcl.Windows’u dahil ettiğinizde MessageBox sınıfının başına tanımlı olduğu Namespace’i yazmalısınız.

 

 

ExitWindowsEx() fonksiyonu 2 parametreye sahiptir. Bu fonksiyona ilk parametre olarak 0 veya EWX_LOGOFF değeri verildiği zaman o sırada programların çalışması sona erdirilir ve geçerli kullanıcının açmış olduğu oturum kapatılır. Aşağıda verilen ekran görüntüsünü ExitWindowsEx() fonksiyonunu anlatmak için hazırladığım projeyi çalıştırıp “Oturumu Kapat” başlıklı düğmeyi tıkladıktan sonra aldım.

 

Bu sırada Evet başlıklı düğme tıklanırsa MessageBox() fonksiyonu geriye “Yes” değerini gönderir ve ExitWindowsEx() fonksiyonu işletilerek mevcut oturum kapatılır.

 

İlk parametre olarak “1” veya EWX_SHUTDOWN verilirse bilgisayar kapatılır. Bu fonksi­yona ilk parametre olarak EWX_REBOOT değeri verilirse bilgisayar kapatılıp yeniden açılır. Bu fonksiyon Windows sürümünden ve Windows’un mevcut ayarlarından etkilendiği için istediğiniz sonucu alama­yabilirsiniz.

 

Kullanmak istediğiniz API fonksiyonu ile ilgili ve Borland tarafından geliştirilen Namespace’i koda dahil etmediyseniz fonksiyonu deklare edip tanımlı olduğu DLL dosyasını işaret etmeli­siniz. Şimdi Borland.Vcl.Windows aldı Namespace’ten yararlanmadan bu fonksiyonu Visual Basic ve C’deki gibi deklare edip kullanacağım. Bu amaçla ilk olarak kod dosyasının Implementation bloğunda ExitWindowsEx() fonksiyonunu aşağıdaki gibi deklare ettim.

 

 

 

ExitWindowsEx() fonksiyonu bu şekilde deklare edildikten sonra Delphi projesi dahilinde kullanılabilir. Fonksiyonun deklare edildiği satırda görebileceğiniz gibi geriye Boolean bilgi gönderilmektedir. Burada Flags parametresinin yerine 0 yazdığım için oturum kapatılır.

 

Sonuc := ExitWindowsEx(0, 0);

 

Yukarıda hakkında bilgi verilen ExitWindowsEx() fonksiyonu Windows’un “users32.dll” adlı DLL dosyasında tanımlıdır. Bu fonksiyonu Visual Basic projesi dahilinde kullanmak istemiş olsaydım aşağıdaki gibi deklare ederdim.

 

 

Yukarıda hakkında bilgi verdiğim ExitWindowsEx() fonksiyonundan C# veya C++ projesi dahilinde yararlanmak istemiş olsaydım bu fonksiyonu aşağıdaki gibi deklare ederdim.

 

[DllImport("User32")]

       public static extern bool ExitWindowsEx(

               int uFlags, int dwReserved);

 

Delphi projeleri dahilinde API fonksiyonlarını C#’taki gibi kullanmak istiyorsanız DllImport deyimi ile fonksiyonun tanımlı olduğu DLL dosyasını işaret ettikten sonra C#’taki gibi deklare edip .NET Framework ile gelen System.Runtime.InteropServices adlı namespace’i koda dahil etmelisiniz. Bu namespace’i koda dahil ettikten sonra ExitWindowsEx() fonksiyonunu aşağıdaki gibi deklare edip kullandım.

 

 

 

Şimdiye kadar API fonksiyonları hakkında verilen bilgilere göre Delphi’nin daha önceki sürümlerini kullandıysanız API fonksiyonlarını kullanırken Borland tarafından geliştirilen Borland.Vcl.Windows ve Borland.Vcl.ShellApi gibi Namepsace’leri koda dahil edip fonksi­yonu kullanmak kolayınıza gelecektir. Bu kitapta örnek olması için hakkında bilgi  verilen API fonksiyonlarını kullanırken yukarıda söz edilen her 3 teknik te kullanıldı.

 

MesasageBox() Fonksiyonu

 

Windows’un MessageBox() fonksiyonundan yararlanıp mesaj verip kullanıcıdan onay almaya yarayan diyalog kutusunu ekrana getirebilirsiniz. Bu fonksiyonu yukarıda sözünü ettiğim her 3 teknik ile kullanmayı deneyeceğim. İlk olarak Borland.Vcl.Windows’u koda dahil edip aşağıda verdiğim kodu yazdım.

 

 

MessageBox() fonksiyonuna 1. parametre olarak ekrana getirilecek diyalog kutusunun handle numarası verilmektedir. 4. parametre olarak verilen 35, 32 ve 3 sayılarının toplamın­dan meydana gelmektedir. 3 sayısı MessageBox tarafından ekrana getirilecek diyalog kutusunda Evet, Hayır ve İptal düğmelerinin olmasını sağlamaktadır. 32 ise diyalog kutusunda mesajdan önce soru(?) işaretinin olmasını sağlamaktadır.

 

 

Bu diyalog kutusunda tıklanan düğmeye göre MessageBox() fonksiyonu geriye sayısal bir değer göndermektedir. Bu değeri yakalamak için aşağıda verdiğim kodu hazırla­dım.

 

Var

    Secim : LongInt;

    Ptr : HWND;

    Yazi : Graphics;

    Yazi_tipi : System.Drawing.Font;

    Nokta : PointF;

    Firca : SolidBrush;

Begin

   Secim := MessageBox(Ptr, 'Dosya Silinsin mi?','Silme Onayı', 35);

   Yazi := self.CreateGraphics;

   Nokta := PointF.Create(30, 40);

   Firca := SolidBrush.Create(Color.Blue);

   Yazi_tipi :=System.Drawing.Font.Create('Tahoma',14,FontStyle.Bold);

   If Secim = 6 Then

       Yazi.DrawString('Evet düğmesini tıkladınız', Yazi_tipi, Firca, Nokta)

   Else If Secim = 7 Then

       Yazi.DrawString('Hayır düğmesini tıkladınız', Yazi_tipi, Firca, Nokta)

   Else If Secim = 2 Then

       Yazi.DrawString('İptal düğmesini tıkladınız', Yazi_tipi, Firca, Nokta);

 end;

 

Bu kod işletilip diyalog kutusundaki düğmelerden birisi tıklandığında tıklanan düğmeye göre formun üzerine mesaj yazılır. Bu örnekte kullanılan System.Drawing’de tanımlı olan Graphics sınıfı hakkında daha önce bilgi verilmişti.

 

 

Şimdi ise Borland.Vcl.Windows’tan yararlanmadan bu API fonksiyonunu kullanacağım. Bu amaçla fonksiyonu formu temsil eden Unit’in Implementation bloğunda aşağıdaki gibi deklare ettim. Ekran görüntüsü verilen koda göre “user32.dll” dosyasında tanımlı olan MessageBox fonksi­yonu 4 parametreye sahiptir ve geriye LongInt bilgi göndermektedir.

 

 

 

Fonksiyonu bu şekilde deklare ettikten sonra yukarıda verdiğim kodda küçük bir değişiklik yaptım. Yukarıda verdiğim kodda bu fonksiyonun 1. parametresi HWND tipindeydi.  HWND tipi Borland.Vcl.Windows’de tanımlı olduğu için 1. parametrenin LongInt tipinde olmasını sağladım.

 

 

 

 

Şimdi ise bu fonksiyonu C#’taki gibi deklare edip System.Runtime.InteropServices’den  yararlanıp kullanacağım. Bu Namespace’i koda dahil ettikten sonra deklarasyonu aşağıdaki gibi yaptım.  Bu şekilde deklare edilen fonksiyon istenildiği gibi kullanılabilir.

 

 

Program Çalıştırmak ve Dosya Açmak

 

Delphi projeleri dahilinde bilgisayara kurulu olan herhangi bir programı çalıştırmak için WinExec() adlı API fonksiyo­nundan yararlanabilirsiniz. WinExec() fonksiyonu 2 paramet­reye sahiptir. İlk parametrede çalıştırılacak program dosyasının adı verilmekte ve 2. paramet­rede ise programa ait pencerenin ilk şekli belirtilmektedir.

 

Çalışma anında WinExec() fonksi­yonu sayesinde Not Defteri programının(Notepad.exe) çalışmasını sağlamak için forma bir düğme yerleştirdim ve bu düğmenin Click() yordamını aşağıdaki gibi düzenledim. Deklarasyon yapmadan WinExec() fonksiyonunu bu şekilde kullanabilmek için Borland.Vcl.Windows’un koda dahil edilmesi gerekir.

 

 

Çalıştırılan programa ait pencere ilk ekrana getirildiği zaman ekranı kaplaması isteniyorsa WinExec() fonksiyonuna 2. parametre olarak 3 değeri verilmelidir. 2. parametre olarak 6 verilirse programa ait pencere simge durumuna küçültülür, 9 verilirse pencere orijinal boyutları ile ekrana getirilir.

 

WinExec() fonksiyonu kendisine 1. parametre olarak verilen program dosyası ile ilgili olarak geriye sayısal bir değer göndermektedir. Çalıştırılmak istenen prog­ram dosyası bulunamazsa geriye 2 gönderilmektedir.

 

Belirtilen sürücü veya klasör bulunmazsa WinExec() fonksiyonu geriye 3 değerini gönderir. Belirti­len programı çalıştırmak için yeterli bellek yoksa geriye 8 gönderilir. WinExec() fonk­siyonun geriye gönderdiği değeri yakalamak için yukarıda verdiğim kodu aşağıdaki gibi değiş­tirdim.

 

 

Delphi projesi dahilinde çalıştırılacak programı çalışma anında belirleyebil­mek için forma bir OpenFileDialog nesnesi yerleştirdim ve yukarıda verdiğim kodu aşağıdaki gibi düzenledim.

 

 

WinExec() fonksiyonunu aşağıdaki gibi kullanıp Denetim Masası penceresini ekrana getire­bi­lirsiniz. WinExec() fonksiyonuna 2. parametre olarak 9 yerine “sw_ShowNormal” sabit bilgisini kullanabilirsiniz.

 

begin

   WinExec('C:\Windows\System32\Control.exe', sw_ShowNormal);

end;

 

Bildiğiniz gibi Denetim Masası penceresinde sistemle ilgili programları temsil eden simge veya seçenekler bulunmaktadır. Denetim Masası penceresini ekrana getirmedeki amacınız Yazıcılar penceresini açıp yazıcılar ile ilgili ayarlama yapmaksa WinExec() fonksiyonunu aşağıdaki gibi kullanabilirsiniz. Bu şekilde düzenlenen WinExec() fonksiyonu sayesinde Denetim Masası penceresi ekrana getirilmeden direk Yazıcılar penceresi açılır.

 

begin

   WinExec('C:\Windows\System32\Control.exe PRINTERS', 9);

end;

 

Denetim Masasındaki bazı uygulamalar CPL uzantılı dosyalar şeklinde gelmektedir. Örneğin “Tarih ve Saat Özellikleri” penceresini ekrana getirmek için TIMEDATE.CPL adlı dosyayı “Control.exe” programı ile açmak gerekmektedir. Bu işlemin nasıl yapıldığını aşağıda görebi­lirsiz.

 

begin

  WinExec('C:\Windows\System32\Control.exe TIMEDATE.CPL', 9);

end;

 

Delphi projeleri dahilinde DOS penceresi açmak istiyorsanız WinExec() fonksiyonunu aşa­ğıdaki gibi kullanabilirsiniz.

 

begin

  WinExec('Command.com', 9);

end;

 

WinExec() fonksiyonunu System.Runtime.InteropServices’den yararlanarak çalıştırmak istemiş olsaydım bu fonksiyonu aşağıdaki gibi deklare ederdim. Fonksiyonları deklare eder­ken parametrelere istediğiniz adı verebilirsiniz.

 

 

ShellExecute() Fonksiyonu

 

Herhangi bir dosyayı ilgili program ile açmak veya yazıcıya göndermek istiyorsanız ShellExecute() fonksiyonunu kullanabilirsiniz. Bu fonksiyonun nasıl kullanıldığını aşağıda görebilirsiniz. ShellExecute() fonksiyonunu kullanabilmek için Borland.Vcl.ShellApi adlı Namespace koda dahil edilmelidir. Verilen kod incelenirse ShellExecute() fonksiyonun toplam 6 parametreye sahip olduğu görülür.

 

 

Bu şekilde düzenlenen yordam işletildiğinde ShellExecute() fonksiyonuna 3. parametre olarak verilen dosya ilgili program ile açılıp ekrana getirilir. Dosyayı yazıcıya göndermek istiyor olsaydım 2. parametrede “Open” yerine “Print” kullanırdım.

 

 

ShellExecute() fonksiyonuna 3. parametre olarak bir dosya adı yerine bir klasörün adını verir ve 2. parametre olarak “Explore” seçeneğini kullanırsanız söz konusu klasörün içeriği Windows Gezgini programı ile ekrana getirilir.

 

ShellExecute(0,'Explore', 'C:\', '', '',SW_SHOW);

 

ShellExecute() fonksiyonu ile yukarıda yapıldığı gibi istediğiniz dosyayı açabildiğiniz gibi web sitelerine bağlanabilirsiniz. ShellExecute() fonksiyonu aşağıdaki gibi düzenlendiğinde Internet Explorer programı çalıştırılır ve belirtilen web sitesine erişim sağlanır.

 

ShellExecute(0,'Open', 'http://www.borland.com', '', '',SW_SHOW);

 

Geçerli Mail programını çalıştırıp E-Mail göndermek istiyorsanız ShellExecute() fonksiyo­nuna ilgili mail adresini 3. parametre olarak vermelisiniz.

 

  ShellExecute(0, 'Open', 'mailto:seckin@seckin.com.tr','','', SW_SHOW);

 

Yukarıda ShellExecute fonksiyonunu kullanırken Borland.Vcl.ShellApi’den yararlandım. Bu Namespace’i projeye dahil etmeden ShellExecute() fonksiyonundan yararlanmak istemiş olsaydım bu fonksiyonu aşağıdaki gibi deklare etmem gerekirdi. Yukarıda belirtildiği gibi API fonksiyonlarını deklare ederken parametrelere istediğiniz adı verebilirsiniz.

 

 

Bu şekilde deklare edilen fonksiyon kullanılırken ekrana gelen pencerenin ilk halini temsil eden 6. parametrede SW_SHOW gibi sabit değerlerin yerine bu sabit değerleri temsil eden sayıları kullanmalısınız. Çünkü bu sabitler Borland.Vcl.Windows.Pas dosyasında tanımlıdır. Bu sabitleri aşağıda tablo halinde verdim.

 

SW_HIDE = 0;

SW_SHOWNORMAL = 1;

SW_NORMAL = 1;

SW_SHOWMINIMIZED = 2;

SW_SHOWMAXIMIZED = 3;

SW_MAXIMIZE = 3;

SW_SHOWNOACTIVATE = 4;

SW_SHOW = 5;

SW_MINIMIZE = 6;

SW_SHOWMINNOACTIVE = 7;

SW_SHOWNA = 8;

SW_RESTORE = 9;

SW_SHOWDEFAULT = 10;

SW_MAX = 10;

 

ShellExecute() fonksiyonunu System.Runtime. InteropServices’ten yararlanarak işletmek istemiş olsaydım bu fonksiyonun tanımlı olduğu DLL dosyasını aşağıdaki gibi kod dahil edip fonksiyonu deklare ederdim.

 

 

Windows’un Kurulu Olduğu Klasörü Öğrenmek
 

Windows’un kurulu olduğu klasörü öğrenmek istiyorsanız GetWindowsDirectory() fonksi­yonunu kullanabilirsiniz. Bu fonksiyon 2 parametreye sahiptir. Bu fonksiyon işle­tildiğinde Windows’un kurulu klasörün adı fonksiyona ilk parametre olarak verilen karaktersel değiş­kene aktarılmaktadır.

 

GetWindowsDirectory() fonksiyonu ilk parametre olarak StringBuilder tipinde bir değişke­ni parametre olarak almaktadır. GetWindowsDirectory() fonksiyonuna ilk parametre olarak verilen değişkenin içerdiği bilginin uzunluğu fonksiyona 2. parametre olarak verilir. StringBuilder sınıfı System.Text adlı Namespace’te tanımlı olduğu için bu Namespace’i projeye dahil etmeniz gerekir.

 

 

GetWindowsDirectory() fonksiyonu geriye Windows’un kurulu olduğu klasörün adının karak­ter sayısı olarak uzunluğunu vermektedir. Aşağıda verilen ekran görüntüsünü çalışma anında formdaki düğmede tıklama yapıp yukarıda verilen kodu işlettikten sonra aldım. Buradaki 15, Windows’un kurulu olduğu klasörünün tahmini uzunluğudur.

 

 

Çalışan programların gerek duyduğu DLL veya diğer sistem dosyalarının kurulu olduğu klasör öğrenilmek istendiğinde GetSystemDirectory() fonksiyonu kullanıl­maktadır. Bu fonksiyonun nasıl kullanıldığını göstermek için forma 2. bir TextBox yerleştirdim ve yuka­rıda verdiğim kodu aşağıdaki gibi düzenledim.

 

 

Bazen de çalıştırılan programın hangi klasörden çalıştırıldığı veya o sırada söz konusu program için hangi klasörün geçerli klasör olduğu öğrenilmek istenir. Bu gibi durumlarda ExtractFilePath() fonksiyonundan yararlanabilirsiniz. Bu fonksiyonun nasıl kullanıldığını aşağıda görebilirsiniz. Bu fonksiyon Delphi’nin Borland.Vcl.SysUtils adlı Namespace’de tanımlı olduğu için projeye dahil edilmelidir.

 

Var

   Yol : String;

begin

   Yol := ExtractFilePath(ParamStr(0));

   TextBox1.Text := Yol;

end;

 

Yukarıda GetWindowsDirectory() fonksiyonu ile Windows’un kurulu olduğu klasörü öğrenirken Borland.Vcl.Windows’tan yararlandım. Eğer bu Namespace’ten yararlanmadan GetWindowsDirectory() fonksiyonunu kullanmak istemiş olsaydım bu fonksiyonu aşağıdaki gibi deklare ederdim.

 

 

Caps Lock ve Num Lock Tuşlarının Durumunu Öğrenmek ve Değiştirmek
 

Klavyenin belirtilen tuşlarının devrede olup olmadığını öğrenmek istiyorsanız GetKeyboardState() fonksiyonundan yararlanabilirsiniz. Bu fonksiyon TKeyboardState tipinde bir değişkeni parametre olarak aldığı için önceden bu değişken tanımlanmalıdır. Bu fonksiyon hakkında bilgi vermek için projenin formunu aşağıdaki gibi düzenledim. Bu fonk­siyon Borland.Vcl.ShellApi’de tanımlıdır.

 

 

Çalışma anında “Tuşları Kontrol Et” bağlığına sahip düğme tıklandığında söz konusu tuşlar devrede ise formadaki düğmeler normal renkte, tuşlar devrede değilse bu düğmeler soluk olacak. Bu amaçla aşağıda verdiğim kodu hazırladım. Borland.Vcl.ShellApi’den yararlan­madan bu fonksiyonu kullanmak istiyorsanız deklare edip ilgili DLL dosyasını işaret etmelisiniz.

 

 

GetKeyboardState() fonksiyonu kullanıldığı zaman kendisine parametre olarak verilen ve dizi değişkenler gibi işlev gören TKeyboardState tipindeki değişkene tuşların durumu hakkında bilgi aktarmaktadır. Hangi tuş hakkında bilgi edinilmek isteniyorsa KeyboardState tipindeki dizi değişkenin ilgili elemanın içeriğine bakılmalıdır.

 

Söz konusu tuş devrede değilse dizi değişkenin o elemanı 0 değerini içerir. Yanda verilen ekran görüntüsünü hem Caps Lock hem Num Lock tuşları devrede değilken bu kodu işlettik­ten sonra aldım.

 

 

Bu sırada Caps Lock tuşuna basıp klavyeyi büyük harflere kilitleyip yukarıda verilen yordamı tekrar işletince aşağıdaki gibi bir sonuç elde ettim. Benzer mantıkla VK_SCROLL paramet­resi ile Scroll Lock tuşunu kontrol edebilirsiniz.

 

 

Delphi projelerinde tuşların durumunda değişiklik yapmak istiyorsanız SetKeyboardState() fonksiyonundan yararlanmalı­sınız. Bu fonksiyon ile tuşların durumlarının nasıl değiştirildi­ğini anlatmak için projenin formunu 2 düğme yerleştirdim ve “Caps_Lock_Tusu” adını verdiğim düğmenin Click yordamını aşağıdaki gibi düzenledim. SetKeyboardState() fonksi­yonun da Borland.Vcl.ShellApi’de tanımlıdır.

 

Var

    Durum : TKeyboardState;

begin

   GetKeyboardState(Durum);

   If Durum[20] = 0 Then

      Durum[VK_CAPITAL] := 1;

   Else

     Durum[VK_CAPITAL] := 0;

     SetKeyboardState(Durum);

end;

 

Görev Çubuğunu ve Masaüstündeki Simgelerini Gizlemek

 

Delphi projesi dahilinde Windows’un görev çubuğunu gizlemek istiyorsanız ShowWindow() fonksiyonunu kullanabilirsiniz. 2 parametreye sahip olan bu fonksiyona ilk parametre olarak üzerinde işlem yapılmak istenen pencerenin Handle numarası verilmektedir.

 

Söz konusu pencerenin Handle numarası bulunurken FindWindow() fonksiyonundan yararlanılmakta­dır. ShowWindow() fonksiyonun orijinal yapısı aşağıdaki gibidir. Yapıda görüldüğü gibi bu fonksiyon geriye Boolean tipinde bilgi göndermektedir.

 

BOOL ShowWindow

(

   HWND hWnd,     

   int nCmdShow

);

 

ShowWindow() fonksiyonu aşağıdaki gibi kullanıldığında görev çubuğu gizlenir. Görev çubuğunu tekrar görüntülemek istiyorsanız ShowWindow() fonksiyonun 2. parametresini SW_SHOW yapmanız yeterlidir.

 

  ShowWindow(FindWindow('Shell_TrayWnd', Nil), SW_HIDE);

 

ShowWindow() fonksiyonuna Handle numarası 1. parametre olarak verilen pencereyi simge durumuna küçültmek istiyorsanız 2. parametre olarak SW_MINIMIZE, ekranı kaplamasını istiyorsanız SW_MAXIMIZE seçeneğini vermelisiniz.

 

Masaüstündeki bütün simgeleri gizlemek istiyorsanız ShowWindow() fonksiyonunu aşağı­daki gibi kullanabilirsiniz. Gizlediğiniz simgelerin tekrar görünmesini sağlamak istiyorsanız SW_HIDE yerine SW_SHOW yazmanız yeterlidir.

 

  ShowWindow(FindWindow(Nil, 'Program Manager'), SW_HIDE);

 

Aynı Programı Birden Fazla Kez Çalıştırmak

 

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 Delphi ile hazırladığınız programın aynı oturumda 2. kez çalıştırılmasını önlemek istiyorsanız GlobalAddAtom() fonksiyonundan yararlanabilirsiniz. Projenin başlangıç formunun Load() yordamını aşağı­daki gibi düzenlemeniz halinde aynı program 2. kez çalıştırılamaz.

 

 

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 değerini göndereceğinden programın çalışması engellenmez. Bu sırada GlobalAddAtom() metodu ile sistem programın çalıştırıldığı konu­sunda bilgilendiri­lir.

 

Program 2. kez çalıştırıldı­ğında GlobalFindAtom() fonksiyonu geriye 0’dan farklı bir değer göndereceği için programın daha önce çalıştırıl­dığı mesajı verilip Halt deyimi ile programın çalışması sona erdirilir.

 

Ancak bu durumda projenin ana formunun Destroy olayını temsil edene Procedure’nin aşağıdaki gibi düzenlenerek programın çalışması sona erdirildiğinde sistemin bundan haber­dar edilmesi gerekir. Destroy() yordamında GlobalDeleteAtom() fonksiyonu kullanılmazsa bu şartlarda Windows tekrar başlatılana kadar aynı program tekrar çalıştırılamaz. Bu yordamda daha önce Load() yordamında tanımladığım “Sonuc” değişkenini kullanıldığım için bu değişkenin tanımlandığı satırı kod dosyasının üst kısmına aldım.