AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Ich krieg mein Fenster nicht automatisch aktiv.
Thema durchsuchen
Ansicht
Themen-Optionen

Ich krieg mein Fenster nicht automatisch aktiv.

Ein Thema von t2000 · begonnen am 25. Feb 2021 · letzter Beitrag vom 25. Feb 2021
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von t2000
t2000

Registriert seit: 15. Dez 2005
Ort: NRW
212 Beiträge
 
Delphi 11 Alexandria
 
#1

Ich krieg mein Fenster nicht automatisch aktiv.

  Alt 25. Feb 2021, 16:19
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:
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  //Application.MainFormOnTaskbar := False;
  frmSplash := TfrmSplash.Create(nil);
  frmSplash.Show;
  Application.CreateForm(TfrmDesktop, frmDesktop);
  Application.Run;
Dann in der frmDesktop:

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:
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;
Ihr seht, das ich hier schon einiges ausprobiert habe.

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
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#2

AW: Ich krieg mein Fenster nicht automatisch aktiv.

  Alt 25. Feb 2021, 16:29
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: MSDN-Library durchsuchenSetForegroundWindow
Such einfach mal Forum ... da gibt es schon viele Threads zu, teilweise auch mit "Lösungen"
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Ich krieg mein Fenster nicht automatisch aktiv.

  Alt 25. Feb 2021, 16:51
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?
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
459 Beiträge
 
#4

AW: Ich krieg mein Fenster nicht automatisch aktiv.

  Alt 25. Feb 2021, 16:51
Ich weis nicht, ob ich deine Anforderungen richtig verstanden habe. Hier meine Interpretation:

Unit frm_Splash.pas
Delphi-Quellcode:
procedure ShowSplash;
begin
  if not Assigned(frmSplash) then
    frmSplash := TfrmSplash.Create(Application);

  frmSplash.Show;
  frmSplash.Update
end;

procedure CloseSplash;
begin
  FreeAndNil(frmSplash);
end;
*.dpr Datei
Delphi-Quellcode:
  ShowSplash;
  Application.Initialize;
  Application.CreateForm(TfrmMain, frmMain);
Unit frm_Main.pas
Delphi-Quellcode:
procedure TfrmMain.FormShow(Sender: TObject);
begin
  PostMessage(Handle, WM_SETUPAPPLICATION, 0, 0);
end;

procedure TfrmMain.WMSetupApplication(var pmvMessage: TMessage);
begin
  CloseSplash;
end;
Bis bald...
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 15. Dez 2005
Ort: NRW
212 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Ich krieg mein Fenster nicht automatisch aktiv.

  Alt 25. Feb 2021, 17:07
@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
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 15. Dez 2005
Ort: NRW
212 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Ich krieg mein Fenster nicht automatisch aktiv.

  Alt 25. Feb 2021, 17:11
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;
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#7

AW: Ich krieg mein Fenster nicht automatisch aktiv.

  Alt 25. Feb 2021, 17:23
Ist ja nicht so,das ich im Hintergrund etwas mache. Bzw. machen will
Dein Programm ist/war ja im Hintergrund (hatte keinen Eingabefokus) und daher verweigert Windows ihm sich selbstständig den Vordergrund zu setzen.

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 15. Dez 2005
Ort: NRW
212 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Ich krieg mein Fenster nicht automatisch aktiv.

  Alt 25. Feb 2021, 17:36
Warum ist/war mein Programm im Hintergrund?

Ich glaube, ich verstehe hier etws nicht.
Auch die Win-Doku sagt doch:
Zitat:
Remarks

The system restricts which processes can set the foreground window. A process can set the foreground window only if one of the following conditions is true:

The process is the foreground process.
The process was started by the foreground process.
- Explorer aktiv
- 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?
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
459 Beiträge
 
#9

AW: Ich krieg mein Fenster nicht automatisch aktiv.

  Alt 25. Feb 2021, 17:50
- Explorer aktiv
- 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?
Also hiermit ist ClientForm bei mir aktiv:
Delphi-Quellcode:
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;
Bis bald...
Thomas
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
629 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Ich krieg mein Fenster nicht automatisch aktiv.

  Alt 25. Feb 2021, 17:57
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:21 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