szukałem na forum ale nie znalazlem, w FAQ jest
http://www.4programmers.net/view_faq.php?id=38
ale mi chodzi o to żeby dodatkowo tę pierwszą kopie programu dać na wierzch ewentulanie wyciągnąć ją z Tray'a.--pozdrowienia
Używam tego w wielu moich programach i działa perfekcyjnie.
Mianowicie, funkcją CreateMutex tworzę (hmm, czy jest jakaś polska nazwa dla tego obiektu??) obiekt mutex o unikalnej nazwie i jeśli ten obiekt już istnieje (nasz program jest już uruchomiony) to:
(piszę z głowy, więc mogę się walnąć - ale idea pozostaje ta sama)
Application->Title = ""; //aby nasz program nie znalazł sam siebie
HANDLE hMutex = CreateMutex (NULL, FALSE, "UnikatowaNazwa");
if ((hMutex != NULL) && (GetLastError () == ERROR_ALREADY_EXISTS))
{if ((hwndPrev = FindWindow (NazwaKlasy, NazwaOkna)) != NULL)
//NazwaKlasy w tym przypadku to nazwa głównej formy poprzedzonej literą T
//jeśli w czasie działania programu nie zmieniamy właściwości Application->Title, to proponuję:
//FindWindow(NULL, NazwaOkna); gdzie NazwaOkna to wartość Application->Title przed jej wyczyszczeniem
SetForegroundWindow (hwndPrev);
CloseHandle (hMutex);
return -1;
}
else
{
//TU JEST ODPALANY PROGRAM
//czyli Application->Initialize(); itd.
CloseHandle (hMutex);
}
(wiem, że w temacie jest [D6], ale nie miałem czasu zamienić to na Delphi - sorry)
--"Imagination is more important than knowledge." - A. Einstein
a nie wkleił bys mi kodu ? wiem ze powinienem popracowac, ale cos mi nie wychodzi : (--pozdrowienia
Jeśli tak bardzo chcesz kod, oto on:
Tym razem nie pisałem z głowy i jest on w pełni działający.
Poniżej masz CAŁY plik cpp (główny plik projektu);
i jeszcze jedna uwaga. Linijki, które wytłuściłem możesz pominąć i zamiast tej drugiej wstawić SetForegroundWindow (hPrevApp);
Ja używam wewnętrznego komunikatu, ponieważ moja aplikacja może siedzieć w tray'u, a funkcją SetForegroundWindow (hPrevApp); jej nie przywołam. Zamiast tego wysyłam zdefiniowany przeze mnie komunikat, którego obsługa przywróci już poprawnie okno.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
USERES("DiskFree.res");
USEFORM("DiskFreeCpp.cpp", FDiskFree);
#define WM_SHOWYOURSELF (WM_APP + 400)
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{HANDLE hInstanceMutex = ::CreateMutex(NULL, true, "DiskFreeMutex");
if(GetLastError() == ERROR_ALREADY_EXISTS)
{if(hInstanceMutex) CloseHandle(hInstanceMutex);
Application->Title = ""; //Aby nie znalazł sam siebie
HWND hPrevApp = ::FindWindow("TFDiskFree", "Wolne miejsce");
if(hPrevApp)
SendMessage(hPrevApp, WM_SHOWYOURSELF, 0, 0); //zdefiniowany przeze mnie komunikat,
return 0; //który powoduje poprawne przywołanie formy
}
try
{Application->Initialize();
Application->Title = "DiskFree";
Application->CreateForm(__classid(TFDiskFree), &FDiskFree);
Application->Run();
}
catch (Exception &exception)
{Application->ShowException(&exception);
}
ReleaseMutex(hInstanceMutex);
CloseHandle(hInstanceMutex);
return 0;
}
//---------------------------------------------------------------------------
To tyle. Pozdrawiam!
--"Imagination is more important than knowledge." - A. Einstein
no wlasnie cpp : )
no ale nic sprobuje w kazdym razie dziekuje
aha a jeszcze jedno bo mam cos takiego ze jak mi aplikacja wychodzi z Traya to raz za czas staje sie tak ze nie staje sie aktywna :( nie wiesz moze czemu tak ?--pozdrowienia
A ja mam prostsza choc nie tak elegancka wersje
poczatek pliku projektu:
begin
Application.Initialize;
if DebugHook=0 then *To pozwala uruchomic program z IDE
begin
Handle:=FindWindow('TFormMain','Analysis'); *szuka okna z nazwa klasy=nazwa klasy glownej formy i tytulem=tytulowi glownej formy
if Handle<>0 then *jesli znajdzie to
begin
SetForegroundWindow(Handle); *wyrzuca to okno na wierzch
Application.Terminate; //i sie zamyka
end;
end;
--
Pawel {Delphi 6 Personal}
Po pierwsze: naciśnij F1