[D6] powtórne uruchomienie programu

0

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

0

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

0

a nie wkleił bys mi kodu ? wiem ze powinienem popracowac, ale cos mi nie wychodzi : (--pozdrowienia

0

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

0

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

0

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&lt&gt0 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

1 użytkowników online, w tym zalogowanych: 0, gości: 1