![]() |
ALT-TAB bei nur einer offenen Applikation
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen
Ich suche einen Workaround oder gar eine Lösung zu folgendem Problem: Ich habe ein MainForm und ein zusätzliches fsStayOnTop-Form. Das fsStayOnTop-Form verschwindet hinter dem MainForm, wenn meine Applikation die einzig offene ist, das MainForm den Fokus hat und ALT-TAB gedrückt wird. Code um das Problem nachzuvollziehen:
Delphi-Quellcode:
Als Attachment habe ich zusätzlich das Borland-Projekt als zip-File hinterlegt.
Application.Initialize;
Application.CreateForm(TForm, Form1); Application.CreateForm(TForm, Form2); Form1.Caption := 'Form1'; Form2.Caption := 'Form2'; Form1.SetBounds(100, 100, 400, 400); Form2.SetBounds(200, 200, 200, 200); Form2.FormStyle := fsStayOnTop; Form2.Show; Application.Title := 'AltTabTest'; Application.Run; Das Problem wurde bereits im ![]() Das Problem an der beschriebenen Lösung ist aber, dass ich in meiner Applikation in der das Problem auftritt, noch andere StayOnTop-Fenster habe. Wenn ich nun das fsStayOnTop-Form einfach im Code wieder in den Vordergrund bringe, bleiben alle anderen Formulare hinter dem MainForm zurück, obwohl es das einzige Fenster ist, welches fsStayOnTop nicht gesetzt hat. Ich nutze - D2005, WinXP SP2 Ich danke euch für eure Unterstützung! |
Re: ALT-TAB bei nur einer offenen Applikation
Vielleicht hilft es, dein MainForm auf den Desktop zu "kleben"? Dann könnte kein Fenster mehr dahinter sein, sondern alle davor.
Delphi-Quellcode:
type
TfrmMain = class(TForm) ... Integer); ... private ... public ... protected procedure CreateParams(var Params: TCreateParams); override; end; var frmMain: TfrmMain; implementation {$R *.dfm} procedure TfrmMain.CreateParams(var Params: TCreateParams); begin //Form klebt am Desktop, d. h. es kann kein Fenster dahinter verschwinden :-) inherited CreateParams(Params); if Assigned(Application.MainForm) then begin Params.WndParent := GetDesktopWindow; Params.Style := WS_CHILD; end; end; |
Re: ALT-TAB bei nur einer offenen Applikation
Habe deinen Vorschlag getestet, es hatte aber keinen Effekt auf das Problem.
Um im Hinterkopf zu halten. Weitere Anforderugnen an meine Applikation (nicht an das @ Test-Programm): - Applikation muss maximiert sein - die Windows-TaskBar muss überblendet werden (auch mit dem MainForm) - ALT-TAB muss sich bei mehreren offenen Applikationen wie gewohnt verhalten |
Re: ALT-TAB bei nur einer offenen Applikation
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal aus einer Anwendung von mir ein kleines Testprogramm extrahiert, das in etwa das macht, was dir vorschwebt. Allerding arbeite ich mit Delphi 2007. Ich weiß nicht, wie das mit deiner Delphi-Version dann klappt.
|
Re: ALT-TAB bei nur einer offenen Applikation
Hab dein kompiliertes Programm ausgeführt. (Delphi 2007)
-> das Problem trat nicht auf Dann kompilierte ich dein Projekt mit Delphi 2005. Dabei stellte ich fest, dass das property Application.MainFormOnTaskbar := True; in Delphi 2005 nicht existiert. Wenn ich diese Zeile auskommentiere, ist aber das Verhalten genau gleich wie bei meinem Testprogram -> Problem immer noch vorhanden Application.MainFormOnTaskbar kam laut ( ![]() Lösungen für Delphi 2005? |
Re: ALT-TAB bei nur einer offenen Applikation
Da kann ich leider nicht weiterhelfen, da ich kein Delphi 2005 habe. Vielleicht hat jemand anderes noch eine Idee?
|
Re: ALT-TAB bei nur einer offenen Applikation
Hallo James,
FormStyle fsStayOnTop funktioniert schlicht nicht zuverlässig. Wir verwenden es überhaupt nicht mehr. Stattdessen haben wir einen Workaround gebaut. Hiermit wird ein Form vor ein anderes gesetzt:
Delphi-Quellcode:
Damit entsteht aber ein Problem beim Minimieren/Wiederherstellen der Applikation. Die "Vorne"-Fenster bleiben sichtbar beim Minimieren. Um dieses Problem zu lösen, mußten wir die Forms.pas (Delphi5) manipulieren (TApplication.WndProc fängt jetzt WM_SIZE mit WParam = SIZE_MINIMIZED ab). Unter Delphi2009 hat es gereicht, Application.MainFormOnTaskbar auf false zu setzen.
SetWindowLong(aFrontForm.Handle, GWL_HWNDPARENT, aBackForm.Handle);
blauweiss |
Re: ALT-TAB bei nur einer offenen Applikation
Hallo blauweiss
Hab dein Vorschlag in mein Beispielprogramm integriert. Es scheint das beschriebene Hauptproblem zu lösen. Allerdings stellte ich wie du beschrieben hast fest, dass nun Probleme beim Minimieren/Wiederherstellen entstehen. Kannst du mir deine Lösung noch etwas genauer erklären? Könnt ihr nach dieser Änderung euer Programm überhaupt noch minimieren? Ich werde nächste Woche versuchen das ganze in meine eigentliche Applikation einzuweben. Erstmal herzlichen Dank euch 2'en! |
Re: ALT-TAB bei nur einer offenen Applikation
Hallo James,
ja, unsere Applikationen (1-5 "normale Fenster", einige dutzend "Vorne-Fenster") laufen nun problemlos. Inklusive Minimieren. Wir mußten dafür jedoch die ausgelieferte Forms.pas anpassen. Das hat den Nachteil, daß wir diese Applikationen nun nicht mehr mit Runtime-Packages compilieren können. Unsere Änderungen in der Forms.pas:
Delphi-Quellcode:
sowie
procedure TApplication.WndProc(var Message: TMessage);
... WM_SIZE: if WParam = SIZE_MINIMIZED then begin DoShowOwnedPopups(false); end; ...
Delphi-Quellcode:
Die Methode TApplication.DoShowOwnedPopups haben wir aus der Delphi2009 Forms.pas abgekupfert.
procedure TApplication.Restore;
... DoShowOwnedPopups(true); // RBRBRB ... Bei Interesse kann ich Dir den Code (~2 Bildschirmseiten) geben. Bin aber erst wieder am Montag im Büro. blauweiss |
Re: ALT-TAB bei nur einer offenen Applikation
Hallo blauweiss
Ich wäre in der Tat sehr froh um deinen Code. Ich habe ausserdem noch keine Erfahrung bei Änderungen in der VCL, wie kompiliere ich die Änderung korrekt? Gibt es verschiedene Varianten (z.B. Änderung gilt nur für einzelnes Projekt oder Änderung gilt für alles)? Wir arbeiten im Team, gibt es da gute Verfahren um die Änderung zu verteilen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 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