Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Forms öffnen nicht im Vordergrund

75 views
Skip to first unread message

André Pönisch

unread,
Oct 3, 2009, 4:17:17 PM10/3/09
to
Hallo allerseits,

ich hab ein merkw�rdiges Verhalten von Forms beobachtet (WinForms,
.net2.0), das jetzt schon in zwei verschiedenen Projekten auftritt und von
daher kein Zufall mehr sein kann.

Das Problem stellt sich so dar, dass die Forms sich nicht im Vordergrund
�ffnen, sondern hinter anderen (applikationsfremden) Fenstern. Bisher
konnte ich nur durch ein kurzes Aktivieren von TopMost im Shown-Event
erzwingen dass die Fenster am Anfang in den Vordergrund kommen. Wobei aber
wiederum der Fokus verloren geht. BringToFront und Activate haben da leider
nicht geholfen.

Das gemeinsame an den Projekten ist, dass die betroffenen Forms das erste
Fenster in einem neuen STA-Thread sind. Sie werden mit ShowDialog ge�ffnet
und haben nat�rlich keine Owner. Weitere Fenster die in dem Thread
gestartet werden, die dann auch einen Owner haben, haben das Problem dann
nicht mehr.

Dieses Vorgehen hat bei den beiden Projekten verschiedene Gr�nde. Bei dem
einen Projekt sollen mehrere Fenster/Dialog-Reihen unabh�ngig voneinander
arbeiten k�nnen, ohne sich gegenseitig zu blockieren. Bei dem anderen
Projekt handelt es sich um ein Setup-Projekt, wof�r ich eine
benutzerdefinierte Aktion mit einem Konfigurations-Formular hab. Da ich
dort auch einen FolderBrowserDialog ben�tige war das auskoppeln in einen
eigenen STA-Thread n�tig.

Das merkw�rdige ist, dass ich das Problem nicht mit einem Minimal-Projekt
nachvollziehen konnte. Daf�r hatte ich eine kleine Forms-Anwendung
geschrieben, in der ich per Knopfdruck einen STA-Thread mit eigener Form
starte. Aber dort funktionierte alles wie es sollte.
Bei den Programmen wo das Problem auftritt, tritt es aber zuverl�ssig auf.

Hat jemand eine Idee woran es liegen k�nnte? M�sste ich bei STA-Threads
irgendwas besonderes beachten, damit so etwas nicht auftritt? Oder hat
vielleicht jemand eine Idee wie man das Problem in den Griff bekommen kann
(eventl. durch Aktionen im WndProc)?

Ich bin f�r jeden Tipp und Vorschlag dankbar.

Gr��e
Andr�

Herfried K. Wagner [MVP]

unread,
Oct 3, 2009, 4:36:57 PM10/3/09
to
Hallo Andr�!

Andr� P�nisch schrieb:


> ich hab ein merkw�rdiges Verhalten von Forms beobachtet (WinForms,
> .net2.0), das jetzt schon in zwei verschiedenen Projekten auftritt und von
> daher kein Zufall mehr sein kann.
>
> Das Problem stellt sich so dar, dass die Forms sich nicht im Vordergrund
> �ffnen, sondern hinter anderen (applikationsfremden) Fenstern. Bisher
> konnte ich nur durch ein kurzes Aktivieren von TopMost im Shown-Event
> erzwingen dass die Fenster am Anfang in den Vordergrund kommen. Wobei aber
> wiederum der Fokus verloren geht. BringToFront und Activate haben da leider
> nicht geholfen.
>
> Das gemeinsame an den Projekten ist, dass die betroffenen Forms das erste
> Fenster in einem neuen STA-Thread sind. Sie werden mit ShowDialog ge�ffnet
> und haben nat�rlich keine Owner. Weitere Fenster die in dem Thread
> gestartet werden, die dann auch einen Owner haben, haben das Problem dann
> nicht mehr.
>
> Dieses Vorgehen hat bei den beiden Projekten verschiedene Gr�nde. Bei dem
> einen Projekt sollen mehrere Fenster/Dialog-Reihen unabh�ngig voneinander
> arbeiten k�nnen, ohne sich gegenseitig zu blockieren. Bei dem anderen
> Projekt handelt es sich um ein Setup-Projekt, wof�r ich eine
> benutzerdefinierte Aktion mit einem Konfigurations-Formular hab. Da ich
> dort auch einen FolderBrowserDialog ben�tige war das auskoppeln in einen
> eigenen STA-Thread n�tig.

Das Hauptformular sollte nicht mittels 'ShowDialog' angezeigt werden,
sondern �ber 'Show'. Was spricht dagegen, 'Application.Run' zu
verwenden, um das Formular anzuzeigen und die Nachrichtenverarbeitung zu
starten (das Fenster schlie�t sich dadurch nicht automatisch).

Je nach Umst�nden kann auch ein eigener Anwendungskontext sinnvoll sein:

ApplicationContext Class (System.Windows.Forms)
<URL:http://msdn.microsoft.com/en-us/library/system.windows.forms.applicationcontext.aspx>

--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>

André Pönisch

unread,
Oct 3, 2009, 7:01:48 PM10/3/09
to
Herfried K. Wagner [MVP] schrieb:

> Das Hauptformular sollte nicht mittels 'ShowDialog' angezeigt werden,
> sondern �ber 'Show'. Was spricht dagegen, 'Application.Run' zu
> verwenden, um das Formular anzuzeigen und die Nachrichtenverarbeitung zu
> starten (das Fenster schlie�t sich dadurch nicht automatisch).
>
> Je nach Umst�nden kann auch ein eigener Anwendungskontext sinnvoll sein:
>
> ApplicationContext Class (System.Windows.Forms)
> <URL:http://msdn.microsoft.com/en-us/library/system.windows.forms.applicationcontext.aspx>

Hallo Herfried,

ShowDialog hatte ich benutzt damit der neu erstellte STA-Thread auch bis
zum Ende des Formulars l�uft und nicht gleich wieder beendet.

�ber Application.Run hatte ich anfangs mal nachgedacht aber eigentlich
gleich wieder verworfen weil ich davon ausgegangen war, dass das
Applikationsweit funktioniert (was auch immer da alles genau gemacht wird)
und sich bei mehreren Aufrufen (in verschiedenen Threads) irgendwo st�ren
w�rde/k�nnte.

Ich hab es jetzt eben mal in einem Minimalprojekt ausprobiert und scheinbar
geht das doch ohne das etwas hakt (z.B. ein ShowDialog in einem Thread
Dialoge im anderen Thread blockieren w�rde).
Das im Minimalprojekt die Forms im Vordergrund erscheinen hatte ja aber eh
schon funktioniert, da muss ich erst noch sehen ob das in den anderen
Projekten hilft.

Der Aufruf einer Hauptform sieht jetzt also in etwa so aus:
Thread thread = new Thread(() =>
{
Application.Run(new MeineForm());
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

Sind da noch Schwierigkeiten zu erwarten oder ist das so der korrekte Weg
wie man es machen sollte?

Jedenfalls sieht das soweit schon mal ganz vielversprechend aus und ich
werde es mal am Montag an den richtigen Projekten ausprobieren.
Danke schon mal.

Gr��e
Andr�

André Pönisch

unread,
Oct 5, 2009, 5:58:49 AM10/5/09
to
Am Sun, 4 Oct 2009 01:01:48 +0200 schrieb Andr� P�nisch:

> Herfried K. Wagner [MVP] schrieb:
>> Das Hauptformular sollte nicht mittels 'ShowDialog' angezeigt werden,
>> sondern �ber 'Show'. Was spricht dagegen, 'Application.Run' zu
>> verwenden, um das Formular anzuzeigen und die Nachrichtenverarbeitung zu
>> starten (das Fenster schlie�t sich dadurch nicht automatisch).
>>
>> Je nach Umst�nden kann auch ein eigener Anwendungskontext sinnvoll sein:
>>
>> ApplicationContext Class (System.Windows.Forms)
>> <URL:http://msdn.microsoft.com/en-us/library/system.windows.forms.applicationcontext.aspx>

Hallo nochmal,

ich hab es jetzt mit Application.Run in den beiden Projekten probiert und
bei beiden hilft es leider nicht weiter. Die Form wird weiter im
Hintergrund und ohne Fokus ge�ffnet.

Der Aufruf sieht jetzt so aus wie zuletzt gepostet:

> Thread thread = new Thread(() =>
> {
> Application.Run(new MeineForm());
> });
> thread.SetApartmentState(ApartmentState.STA);
> thread.Start();

Gerade beim Setup-Projekt ist es schon ein ziemliches Minimalbeispiel, da
passiert au�en herum nicht viel. Trotzdem geht es leider nicht.

Gibt es sonst noch Ideen woran es liegen k�nnte bzw. wie man das Problem
l�sen k�nnte?

Viele Gr��e
Andr�

André Pönisch

unread,
Oct 8, 2009, 8:57:09 AM10/8/09
to
Am Mon, 5 Oct 2009 11:58:49 +0200 schrieb Andr� P�nisch:

> ich hab es jetzt mit Application.Run in den beiden Projekten probiert und
> bei beiden hilft es leider nicht weiter. Die Form wird weiter im
> Hintergrund und ohne Fokus ge�ffnet.
>
> Der Aufruf sieht jetzt so aus wie zuletzt gepostet:
>
>> Thread thread = new Thread(() =>
>> {
>> Application.Run(new MeineForm());
>> });
>> thread.SetApartmentState(ApartmentState.STA);
>> thread.Start();
>
> Gerade beim Setup-Projekt ist es schon ein ziemliches Minimalbeispiel, da
> passiert au�en herum nicht viel. Trotzdem geht es leider nicht.
>
> Gibt es sonst noch Ideen woran es liegen k�nnte bzw. wie man das Problem
> l�sen k�nnte?

Hat niemand mehr eine Idee dazu was man noch probieren k�nnte?

Gr��e
Andr�

Nemorem

unread,
Oct 27, 2009, 9:57:01 AM10/27/09
to
Hatte gerade das selbe Problem, allerdings in VB.NET. Da es in einem Projekt
2 Forms gab bei denen es funktionierte und 2 bei denen es nicht ging bin ich
irgendwann dahinter gekommen:

Platziert man eine NotifyIcon Control auf der Form geht es. Ohne, bleibt die
Form im Hintergrund, egal ob ShowDialog oder Appliaction Run.

Erklären kann ich es mir allerdings nicht...

André Pönisch

unread,
Oct 27, 2009, 12:27:03 PM10/27/09
to
Hallo Nemorem,

> Hatte gerade das selbe Problem, allerdings in VB.NET. Da es in einem Projekt
> 2 Forms gab bei denen es funktionierte und 2 bei denen es nicht ging bin ich
> irgendwann dahinter gekommen:
>
> Platziert man eine NotifyIcon Control auf der Form geht es. Ohne, bleibt die
> Form im Hintergrund, egal ob ShowDialog oder Appliaction Run.
>

> Erkl�ren kann ich es mir allerdings nicht...

Danke erst mal f�r die Antwort. Ich hab schon jegliche Hoffnung aufgegeben
hier noch mal was dazu zu h�ren.

Leider hilft ein NotifyIcon bei mir nicht, die Fenster werden weiter nur im
Hintergrund ge�ffnet. Was vielleicht auch daran liegt das die Anwendung
bereits ein NotifyIcon im Main-Thread hat.

Immerhin wei� ich jetzt das ich mit dem Problem nicht allein bin. ;-)

Gr��e
Andr�

0 new messages