Hi,
ich habe eine kleine rahmenlose Fensteranwendung. Im Designer habe ich zu Form1 ein NotifyIcon hinzugefügt, welches auch korrekt in der Traybar angezeigt wird. Im MouseClick Eventhandler, der sich in der Form1-Klasse befindet, möchte ich nun das Form1 in den Vordergrund bringen wenn es hinter irgendwelchen Programmfenstern verschwunden ist.
Folgende Funktionen zeigen da leider keine Wirkung:
this.BringToFront();
this.Show();
this.Focus();
Da ich das Problem mittlerweile in den Griff gekriegt habe hier nochmal die Lösung für alle Suchenden:
using System.Runtime.InteropServices;
....
public partial class Form1 : Form
{
[DllImport("user32.dll")]
public extern static int SetForegroundWindow(IntPtr HWnd);
private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
{
SetForegroundWindow(this.Handle);
}
Das funktioniert nun 😃
Hallo PoWl,
schön, dass du eine Antwort gefunden und vielen Dank, dass du sie hier geschrieben hast. Noch besser ist es, eigene Lösungen als Antwort zu posten, damit der Thread nicht mehr in den "Fragen ohne Antwort" auftaucht. Durch diese Antwort ist das Ziel aber auch erreicht.
herbivore
Hallo
ich habe genau das gleiche Problem. Bei mir geht das auch nicht. Ich habe es zwar mit dem Code von oben versucht, aber es geht nicht.
Der einzige Unterschied bei mir ist, dass ich ein MDI verwende. Ich habe es so gemacht, dass er ein Child vom gleichen Typ nur einmal öffnen kann, wenn mann es ein zweites mal versucht, soll das Child einfach in den Vordergrund kommen.
Kann es sein, dass dieser Code in Zusammenhang mit einem MDI nicht funktioniert?
Grüsse
Bei meiner MDI Anwendung mach ich es folgenderweise und es funktioniert bei mir. Der Parameter frm ist dabei die MDI Form.
private void ShowForm(Form frm)
{
if (frm.WindowState == FormWindowState.Minimized)
{
frm.WindowState = FormWindowState.Normal;
}
frm.Show();
frm.BringToFront();
}
Und wenn du bei der Win32-API bleiben willst:
Prüfen, ob Fenster minimiert ist (IsIconic), dann ggf. ShowWindowAsync mit SW_RESTORE aufrufen.
Bei meiner MDI Anwendung mach ich es folgenderweise und es funktioniert bei mir. Der Parameter frm ist dabei die MDI Form.
private void ShowForm(Form frm) { if (frm.WindowState == FormWindowState.Minimized) { frm.WindowState = FormWindowState.Normal; } frm.Show(); frm.BringToFront(); }
Also damit klappt es bei mir nicht, den MDI-Container schliesse ich ja nicht, ich habe nur Child-Forms, die ich wieder in den Vordergrund holen möchte.
Grüsse
Ich habe dir mal eine kleine MDI-Anwendung als Solution beigefügt. Kannste ja mal bei dir ausprobieren.
[Edit:]Habe nochmal den Fehler im Beispiel korrigiert.
Hallo tabstop
dein Beispiel funktioniert wunderbar, aber einen Schönheitsfehler gibt es noch. Und zwar, wenn du ein Child-Form schliesst, kannst du es nachher nicht wieder öffnen.
Grüsse
Ja stimmt. Ich habe es auch nur schnell zusammen geschustert. Ist aber einfach zu ändern, indem der private Konstruktor der MDI-Child auf public geändert wird und der Zugriff auf die Forms folgenderweise:
private FormChild1 mdi1;
public FormChild1 Mdi1
{
get
{
if (this.mdi1 == null || this.mdi1.IsDisposed)
{
this.mdi1 = new FormChild1();
this.mdi1.MdiParent = this;
}
return mdi1;
}
}