Einzelnen Beitrag anzeigen

CodeX

Registriert seit: 30. Okt 2004
471 Beiträge
 
Delphi 12 Athens
 
#1

Mehrfachstart, SC_RESTORE & Nicht-Hauptform hervorholen

  Alt 28. Feb 2010, 14:54
Um einen Mehrfachstart der eigenen Anwendung zu verhindern und stattdessen die bereits laufende Instanz hervorzuholen, verwende ich folgenden Code:
Delphi-Quellcode:
  repeat
    appH := FindWindow(PChar('TMyMainForm'), nil);
  until appH <> Application.Handle;
  if (appH <> 0) then
  begin
     ParentH := GetWindowLong(appH, GWL_HWNDPARENT);
     Windows.ShowWindow(appH, SW_Normal);
     postmessage(ParentH,WM_SYSCOMMAND,SC_RESTORE,0);
     Windows.SetForegroundWindow(appH);
     Halt(1);
  end;
Nun habe ich in dem Programm unterschiedliche Oberflächen, von denen immer nur eine aktiv sein soll.
Mit dem oberen Code wird leider immer nur die Hauptform hervorgeholt (auch wenn ich TMyMainForm durch TMyUnterForm ersetze). Ich würde aber stattdessen gerne selber entscheiden, welche Form hervorgeholt werden soll.

Idealerweise sollte das auch in der bereits laufenden Instanz geschehen und nicht in der zweiten, die gerade gestartet wird.
Deshalb dachte ich, ich fange die Message im laufenden Programm ab und führe dann eine eigene Aktion durch.

Jetzt habe ich aber nach vielem Rumprobieren aber immer noch nicht herausgefunden, wie ich das am besten mache.

So stehe ich aktuell:
Delphi-Quellcode:
procedure TMyMainForm.ApplicationEventsMessage(var Msg: tagMSG; var Handled: Boolean);
var
  appH, ParentH : THandle;
begin
  if Msg.message = WM_SYSCOMMAND then
  begin
    case Msg.wParam of
      SC_RESTORE:
      begin
        ShowMessage('SC_RESTORE');
        ApplicationEvents.CancelDispatch;
        //hier dann manuell Fenster hochholen
      end;
    else
      Inherited;
    end;
  end;
end;
Die Messagebox erhalte ich, aber das Fenster kommt trotzdem hoch. Ich vermute, ich müsste die Restore-Aktion vorher schon unterbinden. Nur wie und wo?

Hat jemand eine Idee?
  Mit Zitat antworten Zitat