![]() |
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? |
Re: ALT-TAB bei nur einer offenen Applikation
In meinem Beispielprojekt funktioniert diese Lösung. Damit Tastenkombinationen wie 'WIN-D' oder 'WIN-M / WIN-SHIFT-M' muss allerdings auch folgende Methode angepasst werden:
Delphi-Quellcode:
Für meine Hauptapplikation, brachte die Änderung keine Besserung, das liegt aber wohl daran, dass der ganze Code noch überprüft werden sollte, ob im Code der vorgestellte Mechanismus ausgehebelt wird. Ich werde diesen Beitrag als gelöst markieren. Bin jedoch weiter offen für Tipps und Tricks zum Thema.
procedure TApplication.RestoreTopMosts;
... DoShowOwnedPopups(true); // RBRBRB ... Besten Dank euch allen! James Kafka |
Re: ALT-TAB bei nur einer offenen Applikation
Hallo James,
die Änderung DoShowOwnedPopups(true) muß in procedure TApplication.Restore; nicht in procedure TApplication.RestoreTopMosts; Diese Lösung funktioniert auch mit Tastenkombinationen 'WIN-D' und 'WIN-M' ! Prüfe doch mal, ob die geänderte Forms.pas wirklich mitkompiliert wird. Evtl. mußt Du auch die ausgelieferten Versionen der Forms.dcu suchen und entfernen. blauweiss |
Re: ALT-TAB bei nur einer offenen Applikation
Ich habe alles noch einmal kontrolliert, sowie die vorhandenen Forms.dcu gelöscht.
Das Verhalten ist jedoch wie ich beschrieben habe. Ist DoShowOwnedPopups(true); nur in procedure TApplication.Restore; vorhanden, funktioniert die Tastenkombination WIN-D nicht korrekt. Wenn diese Zeile auch in procedure TApplication.RestoreTopMosts; vorhanden ist, klappt's. Was mich noch etwas stuzig macht, ist dass viel von deinem zugefügten Code schon in meiner originalen Forms.pas (Delphi 2005) vorhanden war. Ich schicke dir deshalb die Orignal Forms.pas Datei mal zu. |
Re: ALT-TAB bei nur einer offenen Applikation
Hallo James,
das ist gut möglich, denn ich habe diese Änderungen ja aus der Forms.pas von Delphi 2009 "zurückgerüstet" für Delphi 5. Das heißt, Borland/Inprise/Embarcadero hatte die Forms.pas bereits in Delphi 2005 überarbeitet, nur eben (wie auch 2009 noch) nicht vollständig funktional. Seltsam ist nur, daß in unserem Delphi 5 kein Eingriff in die Methode RestoreTopMosts nötig war.... blauweiss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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