AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Mehrfachstart, SC_RESTORE & Nicht-Hauptform hervorholen
Thema durchsuchen
Ansicht
Themen-Optionen

Mehrfachstart, SC_RESTORE & Nicht-Hauptform hervorholen

Offene Frage von "CodeX"
Ein Thema von CodeX · begonnen am 28. Feb 2010
Antwort Antwort
CodeX

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

Mehrfachstart, SC_RESTORE & Nicht-Hauptform hervorholen

  Alt 28. Feb 2010, 15: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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:29 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