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 WMSize zu früh (https://www.delphipraxis.net/93913-wmsize-zu-frueh.html)

MasterEvil 13. Jun 2007 10:39


WMSize zu früh
 
Hallo,

wie in diesem Thread beschrieben, würde ich gerne verhindern, dass meine Applikation im Hintergrund verschwindet, wenn man ein modales Formular minimiert.

In Delphi 6 konnte ich dies noch so tun:
Delphi-Quellcode:
procedure CBaseForm.WMSize(var Message: TWMSize);
begin
  inherited;
  if WindowState=wsMinimized then Self.BringToFront;
end;
Dies funktioniert nun nicht mehr. Hab statt BringToFront schon mehrere andere Methoden ausprobiert, um meine Applikation wieder in den Vordergrund zu holen, dies hat aber nichts bewirkt.

Wenn ich WMActive abfange, verliert meine Form zunächst den Fokus, wird dann wieder aktiviert (ich nehme an von meinem BringToFront) und verliert danach den Fokus wieder. Also gehe ich davon aus, dass nach dem WMSize wieder irgendwer mir den Fokus weg nimmt. Durch die Windows Messages krieg ich es aber nicht debuggt.

Gibt es nach dem WMSize etwas, wo ich ansetzen könnte? Oder hat vielleicht jemand eine andere Idee, wie ich mein Problem lösen kann?

Gruß,
Steffen

MasterEvil 14. Jun 2007 15:03

Re: WMSize zu früh
 
Keiner eine Ahnung? :(

luka 14. Jun 2007 22:26

Re: WMSize zu früh
 
Delphi-Quellcode:
procedure BringAppToFront;
var Th1, Th2: Cardinal;
begin
  Th1 := GetCurrentThreadId;
  Th2 := GetWindowThreadProcessId(GetForegroundWindow, nil);
  AttachThreadInput(Th2, Th1, True);
  try
    SetForegroundWindow(Application.Handle);
    Application.Restore;
  finally
    AttachThreadInput(Th2, Th1, False);
  end;
end;

MasterEvil 15. Jun 2007 08:24

Re: WMSize zu früh
 
Hallo luka,

fast den selben Quelltext hab ich auch schon ausprobiert.
Hab deinen auch nochmal getestet, aber wie zu erwarten, funktioniert er nicht :(

Trotzdem danke,
Steffen

luka 15. Jun 2007 08:35

Re: WMSize zu früh
 
versuch es einmal hiermit:
Delphi-Quellcode:
procedure ShowForm(Form: TForm);
begin
  if Assigned(Form) then
  begin
    ShowWindow(Form.Handle, SW_SHOWNORMAL);
    Form.Visible := True;
    Form.BringToFront;
  end;
end;

procedure HideForm(Form: TForm);
begin
  if Assigned(Form) then
  begin
    Form.Visible := False;
    ShowWindow(Form.Handle, SW_HIDE);
  end;
end;
Beim Show als letztes einen Timer starten (250ms) und ShowForm(Self) oder BringAppToFront ausführen, oft ist es nur ein Zeitproblem.
Irgendwie muss es ja gehen, oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 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 by Thomas Breitkreuz