Program bir kez açılsın

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Serhat
Üye
Mesajlar: 203
Kayıt: 27 Tem 2014 10:10

Program bir kez açılsın

Mesaj gönderen Serhat » 02 Kas 2017 07:24

Merhabalar;

Programda son aşamaya geldim, fakat bir noktada takıldım kaldım; Program bilgisayar açılınca otomatik olarak açılıyor, Buraya kadar bir sorun yok.
Program ikonuna tıklandığında program kapalıysa yeniden başlayacak, fakat hide durumundaysa yeniden ekrana gelecek, bunu nasıl yaptırabilirim.


Saygılarımla.

ertank
Üye
Mesajlar: 962
Kayıt: 11 Eyl 2015 11:45

Re: Program bir kez açılsın

Mesaj gönderen ertank » 02 Kas 2017 10:20

Merhaba,

Öncelikle Windows 7 ve sonrasında ikinci kısımda istediğiniz işlemi "A uygulaması B uygulamasını ekranın en önüne getirsin" gerçekleştirmeniz çok ama çok zor. Dikkat etti iseniz, işletim sisteminin kendi işlemleri dahi artık ekranın en önüne ve seçili pencere olarak gelemiyor. Örneğin kopyala yapıştır işlemleri arka planda kalıp taskbar üzerinde yanıp sönme yapıyorlar.

Sorunuzun ilk kısmı ile ilgili olarak bir programın ikinci kopyasının çalışmasını engellemek için projenizin DPR dosyası içinde aşağıdaki gibi bir kod kullanabilirsiniz.

Kod: Tümünü seç

program BenimUygulamam;

uses
  Vcl.Forms,
  Windows,  // CreateMutex() için kullanılıyor
  uMain in 'uMain.pas' {frmMain};

{$R *.res}

begin
  CreateMutex(nil, False, 'Benim uygulamama özel eşi benzeri olmayacak bir metin bilgisi. En güzel kullanımı GUID şeklinde olacaktır.');
  if GetLastError = ERROR_ALREADY_EXISTS then 
  begin
    // Uygulama kopyası çalşıyor.
    // İkici kopya olarak biz kendimizi çalıştırmadan kapatıyoruz
    Exit();
  end;

  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TfrmMain, frmMain);
  Application.Run;
end.
Bu noktadan sonra, Eğer uygulama çalışıyorsa kısmı için kendi çözümünüzü geliştirmenizde fayda var. Olası çözüm yöntemleri aşağıdakilerden birisi olabilir:
1- Eğer uygulamanız database kullanıyor ise database içinde belli bir tablo yardımı ile çalışan uygulamanıza mesaj gönderebilirsiniz. Çalışan uygulama bir thread içinde sürekli bu alanın değerini kontrol edip değer aktif olduğu zaman değeri silip kendisini ekranda gösterebilir.
2- Eğer çok sık ve yoğun bir şekilde aynı uygulama çalıştırılmayacak ise ortak bir metin dosyasını aynı amaç için kullanabilirsiniz. Bu noktada okuma yapan kodu dikkatli yazmalısınız. Tam okuma yapacağınız sırada kullanıcı uygulama kopyasnı çalıştırıp ortak kullanılacak dosyayı sadece yazılır modda açmış olabilir. Bu durumda bir sonraki kontrol zamanını beklemeniz gerekecekdir. Database sistemi ile bu gibi sorunlar yaşamazsınız.
3- Windows messaging system kullanabilirsiniz. Uygulama bir kopyasının çalıştığını anladığı zaman kendine özel bir kanal üzerinden PostMessage() windows API komutunu kullanarak çalışan uygulamayı bilgilendirebilir. Buna benzer bir kod yazmak bir miktar işletim sistemi bilgisi de gerektirecektir.

Bunlar dışında da alternatif yöntemler geliştirmek mümkün. Ancak ilk ektapta bu örneklerin yeterli olacağını düşünüyorum.

Cevapla