Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Mehrfachstart, SC_RESTORE & Nicht-Hauptform hervorholen (https://www.delphipraxis.net/148365-mehrfachstart-sc_restore-nicht-hauptform-hervorholen.html)

CodeX 28. Feb 2010 14:54


Mehrfachstart, SC_RESTORE & Nicht-Hauptform hervorholen
 
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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz