Laden...

Fenster in den Vordergrund bringen

Erstellt von PoWl vor 14 Jahren Letzter Beitrag vor 13 Jahren 21.549 Views
P
PoWl Themenstarter:in
219 Beiträge seit 2008
vor 14 Jahren
Fenster in den Vordergrund bringen

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 😃

49.485 Beiträge seit 2005
vor 14 Jahren

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

T
506 Beiträge seit 2005
vor 13 Jahren

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

T
94 Beiträge seit 2007
vor 13 Jahren

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();
    }

68 Beiträge seit 2008
vor 13 Jahren

Und wenn du bei der Win32-API bleiben willst:
Prüfen, ob Fenster minimiert ist (IsIconic), dann ggf. ShowWindowAsync mit SW_RESTORE aufrufen.

T
506 Beiträge seit 2005
vor 13 Jahren

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

T
94 Beiträge seit 2007
vor 13 Jahren

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.

T
506 Beiträge seit 2005
vor 13 Jahren

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

T
94 Beiträge seit 2007
vor 13 Jahren

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;
      }
    }