![]() |
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:
Nun habe ich in dem Programm unterschiedliche Oberflächen, von denen immer nur eine aktiv sein soll.
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; 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:
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?
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; Hat jemand eine Idee? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz