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?