![]() |
Ich krieg mein Fenster nicht automatisch aktiv.
Hi zusammen,
ich hoffe, hier reicht ein kleine Hilfe. Folgende Situation VCL 64bit Windows Das Delphi Main Formular soll (erstnmal) ohne Funktion im Hintergrund sein. Ich möchte ein weiteres Formular sofort nach dem Start öffnen und AKTIV haben. Ich sehe das, weil die FensterTitelBar im inaktiven Zustand eine andere Farbe hat und sich leider einige Komponenten erst bei Aktivierung korrekt zeichnen. DPR-Quelltext: Erzeugen, Anzeigen Splash Create Delphi-Mainform (frmDesktop)
Delphi-Quellcode:
Dann in der frmDesktop:
Application.Initialize;
Application.MainFormOnTaskbar := True; //Application.MainFormOnTaskbar := False; frmSplash := TfrmSplash.Create(nil); frmSplash.Show; Application.CreateForm(TfrmDesktop, frmDesktop); Application.Run; Da ich den Splashscreen solange stehen haben möchte, bis wirklich alles fertig ist, habe ich die das ApplicationIdleEvent genutzt. Dort erzeuge ich dann die eigentlichen Mainform und möchte sie anzeigen/aktivieren
Delphi-Quellcode:
Ihr seht, das ich hier schon einiges ausprobiert habe.
procedure TfrmDesktop.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
begin if frmSplash <> nil then begin SystemInit; FfrmMain := TfrmMain.Create( self); FfrmMain.Init; FfrmMain.Show; FfrmMain.SetFocus; FfrmMain.btnHomeClick(nil); FreeAndNil( frmSplash); // FfrmMain.btnHomeClick(nil); // SetForegroundWindow( FfrmMain.Handle); // FfrmMain.SetFocus; end; Das Fenster erscheint (im Vollbildmodus), ist aber nicht aktiv. Erst wenn ich dann manuell mit der Maus klicke, wird das Fenster aktiviert. (Sichtbar durch Anpassung der FensterTitelFarbe) Was mache ich falsch? Wie geht es besser? Gruß Thomas |
AW: Ich krieg mein Fenster nicht automatisch aktiv.
Windows lässt standardmäßig nicht mehr zu, dass sich irgendein Hintergrund-Programm selbst in den Vordergrund holt (außer auf Interaktion mit dem Benutzer, wenn er klickt)
* das aktive Programm kann deinem Programm das Recht geben sowas machen zu dürfen * ... siehe Remarks: ![]() Such einfach mal Forum ... da gibt es schon viele Threads zu, teilweise auch mit "Lösungen" |
AW: Ich krieg mein Fenster nicht automatisch aktiv.
Tipp: Manchmal ist es wirklich die IDE (oder ein IDE-Plugin) welches sich gewaltsam den Fokus holt obwohl dein Programm es eigentlich hätte. Besteht das Problem auch wenn du deine Anwendung "ganz normal" (also nicht über die IDE, auch ohne Debugging) startest?
|
AW: Ich krieg mein Fenster nicht automatisch aktiv.
Ich weis nicht, ob ich deine Anforderungen richtig verstanden habe. Hier meine Interpretation:
Unit frm_Splash.pas
Delphi-Quellcode:
*.dpr Datei
procedure ShowSplash;
begin if not Assigned(frmSplash) then frmSplash := TfrmSplash.Create(Application); frmSplash.Show; frmSplash.Update end; procedure CloseSplash; begin FreeAndNil(frmSplash); end;
Delphi-Quellcode:
Unit frm_Main.pas
ShowSplash;
Application.Initialize; Application.CreateForm(TfrmMain, frmMain);
Delphi-Quellcode:
Bis bald...
procedure TfrmMain.FormShow(Sender: TObject);
begin PostMessage(Handle, WM_SETUPAPPLICATION, 0, 0); end; procedure TfrmMain.WMSetupApplication(var pmvMessage: TMessage); begin CloseSplash; end; Thomas |
AW: Ich krieg mein Fenster nicht automatisch aktiv.
@himitsu
Gesucht ja, aber nicht viel gefunden. Die Lösungen aus 2007 funktionieren nicht "ForceForegroudWindow" @Der schöne Günther Ja, auch wenn ich es extern starte. @mytbo Nein, so nicht. Es geht nicht um den Splashscreen. Den kann man komplett weg lassen. Ich erzeugt ein Form (frmDesktop) und von dort aus ein weiteres Form frmMain. Ich zeige dies und es ist nicht aktiv. Ich dachte, wenn ich aus einer Anwendung/Form eine neue Form erzeuge und öffne/zeige, dann sollte diese auch aktiv sein. Ist ja nicht so,das ich im Hintergrund etwas mache. Bzw. machen will |
AW: Ich krieg mein Fenster nicht automatisch aktiv.
Sollte dies alleine nicht reichen, um ein Formular zu erzeugen, zu zeigen und dort aktiv zu sein? Also auch den Eingabefokus zu erhalten?
Delphi-Quellcode:
// ich bin in einer beliebigen Form und mache von dort:
FfrmMain := TfrmMain.Create( self); FfrmMain.Show; |
AW: Ich krieg mein Fenster nicht automatisch aktiv.
Zitat:
Wenn man ein Programm neu startet, dann war der Andere (Desktop/Explorer/Startmenü/...) vorher altiv und somit kann ein neues Programm auch sofort aktiv werden. (ist eine der Bedingungen, wie sie im SetForegroundWindow aufgzählt werden) Ich weiß auch grade nicht wo, aber es wurden auch schonmal irgendwelche "Tricks" genannt, welche womöglich noch funktionieren. |
AW: Ich krieg mein Fenster nicht automatisch aktiv.
Warum ist/war mein Programm im Hintergrund?
Ich glaube, ich verstehe hier etws nicht. Auch die Win-Doku sagt doch: Zitat:
- ich starte mein Programm - Mein Programm aktiv mit Main-Fenster - Ich erzeuge/öffne ein neues Fenster Warum sollte dieses neue Fenster nicht aktiv sein? Wo hab ich den Denkfehler? |
AW: Ich krieg mein Fenster nicht automatisch aktiv.
Zitat:
Delphi-Quellcode:
Bis bald...
procedure TfrmMain.FormShow(Sender: TObject);
begin PostMessage(Handle, WM_SETUPAPPLICATION, 0, 0); end; procedure TfrmMain.WMSetupApplication(var pmvMessage: TMessage); begin FClientForm := TfrmClient.Create(Self); FClientForm.Show; end; Thomas |
AW: Ich krieg mein Fenster nicht automatisch aktiv.
Warum machst du es nicht einfach so im DPR:
Delphi-Quellcode:
Application.Initialize;
Application.MainFormOnTaskbar := True; //Application.MainFormOnTaskbar := False; frmSplash := TfrmSplash.Create(nil); try frmSplash.Show; Application.CreateForm(TfrmDesktop, frmDesktop); finally frmSplash.Free; end; Application.Run; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:52 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-2025 by Thomas Breitkreuz