Einzelnen Beitrag anzeigen

Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Mal wieder: Doppeltes starten einer Anwendung unterbinde

  Alt 17. Feb 2010, 00:58
Zitat von dust258:
Kennt Ihr das: In DEM MOMENT in dem ich hier den Thread abgesendet habe finde ich die Lösung
Danke fürs Kopfzerbrechen, ich musste nur "FindWindow('TListStatSchnittForm', nil);" nutzen ^^
Nur zu Genüge! Ich bekomme mit der Vorgehensweise aber immer nur ein graues Fenster. Ich kann es verschieben, aber nicht minimieren, nicht schließen und - wie gesagt - ich sehe keine Komponenten mehr auf dem Fenster.

Ich persönlich finde es auch etwas kompliziert:
Den Code zum Finden des Fenster-Handle gibt einem WinSpy wesentlich kürzer aus. Da Du Deinen Titel und die Klasse kennst, ist das Fenster auch eindeutig identifizierbar. So kannst Du das herausfiltern des Fensternamens sparen, wenn Du bei FindWindow statt nil als zweiten Parameter, den Titel angibst.
Ich mag mich irren, aber Handle ist Handle und dann sollte BringWindowToTop() auch gehen. Und schließlich würde ich Deinen Code vor Application.Initialize platzieren. Das spart Zeit, Speicher etc. weil gleich als erstes geprüft wird, ob bereits ein Instanz läuft.

Ich "löse" mein Problem etwas unorthodox - allerdings Dank Deines Schemas - dann so (dpr-Datei):
Delphi-Quellcode:
Const
   MutexName   ='Eindeutiger Name für ein Chat-Programm';
Var
   hMutex : THandle;
   Wnd : Hwnd;
Begin
   hMutex:=CreateMutex(nil, True, MutexName);
   If GetLastError = ERROR_ALREADY_EXISTS Then
   Begin
      CloseHandle(hMutex);
      Wnd:=FindWindow('TChat', 'Nachrichten');
      If Wnd <> 0 Then
      Begin
         SendMessage(Wnd, WM_2ndInstance, 0, 0);
         Halt;
      End;
   End;

   Application.Initialize;
   Application.ShowMainForm:=False;
   Application.CreateForm(TChat, Chat);
   Application.Run;
End.
In der Unit fürs MainForm reagiere ich dann so:
Delphi-Quellcode:
Const
   WM_2ndInstance = $0406;
Type
   TChat = Class(TForm)
                       ...
                     Private
                       Procedure WM2ndInstance(Var Msg: TMessage); Message WM_2ndInstance;
                       ...
                     End;
...

Procedure TChat.WM2ndInstance(Var Msg: TMessage);
Begin
   Show;
End;
Keine Ahnung, ob man das so macht. Aber es funktioniert.

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat