Witam
Piszę aplikacje której jedną z możliwości będzie wykrywanie uruchomionej kopi samej siebie.
Chodzi o to że mam aplikacje o nazwie np. X i teraz gdy ta aplikacja zostanie uruchomiona np 5 razy to ta co została jako pierwsza uruchomiona działa normalnie
a pozostałe 4 przechodzą w stan oczekiwania jeśli zostanie zamknięta apikacja aktywna to uaktywnia się któraś z tych czterech a pozostałe trzy dalej czekają itd.
Problem polega na tym że wiem jak zrobić aby program wykrył ze uruchomiona juz jest jego kopia
ale nie wiem jak w momencie wyłączenia aplikacji aktywnej wykryć to zdarzenia
właściwie to mi się to nawet udało używając klasy TATOM ale tam musze przy konczeniu aplikacji zwalniać pamięć i wtedy wszystko działa gorzej gdy aplikacja zostanie zamknięta z błędem tzn się po prostu wysypie
lub zostanie wyłączona w sposób nagły np z menagera zadań wtedy nie występuje zdarzenie OnDestroy a to w nim umieściłem owe zwolnienie pamięci.
Wymyśliłem też system polegający na rozsyłaniu komunikatu tzn
aplikacja aktywna wysyła komunikat w taki sposób
procedure TForm1.komsendTimer(Sender: TObject);
var
H : THandle; // zmienna przechowująca uchwyt
begin
H := FindWindow(nil,'X SYSTEM');// szukanie okna...
PostMessage(H,X_KOM, 1, 1);// wysłanie komunikatu
end;
i odbieram go przez aplikacje
jesli ona nie wykryje przesłania komunikatu to przechodzi w tryb aktywny a jak wykryje to pozostaje w stanie oczekiwania
i tak w kółko
tyle że to rozwiązanie ma tęż wadę
jeśli jakieś okno to przechwyci to komunikat ginie czyli efekt jest taki ze jak uruchomie 5 aplikacji to 5 przechodzi w tryb aktywny bo praktycznie komunikat jest przechwytywany nawet jak aplikacja jest w trybie aktywnym
Pytanie brzmi tak
Czy istnieje jakiś lepszy sposób na ten problem?
Czy da się wysłać komunikat który edzie dotyczył wszystkich okien o dane nazwie ?
Proszę o pomoc i Pozdrawiam