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.
Program bir kez açılsın
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: Program bir kez açılsın
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.
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.
Ö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.
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.