it-swarm.com.de

Wie kann ich mein Anwendungsfenster nach vorne bringen?

Wie kann ich mein Anwendungsfenster nach vorne bringen? Zum Beispiel, wenn meine App Aufmerksamkeit braucht.

Dies ist für mein persönliches Programm. Ich brauche diese Funktionalität.

Das habe ich bekommen. Aber es ist NICHT 100% mal arbeiten.

public void BringToFrontToEnterCaptha()
{
    if (InvokeRequired)
    {
        Invoke(new Action(BringToFrontToEnterCaptha));
    }
    else
    {
        this.TopMost = true;
        this.Focus();
        this.BringToFront();
        this.textBox1.Focus();
        this.textBox1.Text = string.Empty;
        System.Media.SystemSounds.Beep.Play();
    }
}

public void BringToBackAfterEnterCaptha()
{
    if (InvokeRequired)
    {
        Invoke(new Action(BringToBackAfterEnterCaptha));
    }
    else
    {
        this.TopMost = false;
    }
}

Und ich rufe sie vom Hintergrundarbeiter an.

BringToFrontToEnterCaptha();
while (!ready)
{
    Thread.Sleep(100);
}
BringToBackAfterEnterCaptha();
Thread.Sleep(300);

Und nach dem Drücken der Schaltfläche "Akzeptieren" wird bool ready auf true gesetzt.

Ich arbeite großartig, aber nicht immer.

73
Hooch

Verwenden Control.BringToFront :

myForm.BringToFront();
34
Jon

Hier ist ein Code, der für mich funktioniert hat

this.WindowState = FormWindowState.Minimized;
this.Show();
this.WindowState = FormWindowState.Normal;

Es bringt immer das gewünschte Fenster vor alle anderen.

156
Shabbir Hussain

Verwenden Sie die Methoden Form.Activate() oder Form.Focus().

55
as-cii

Obwohl ich allen zustimme, ist dies kein nettes Verhalten. Hier ist der Code:

[DllImport("User32.dll")]
public static extern Int32 SetForegroundWindow(int hWnd);   


SetForegroundWindow(Handle.ToInt32());

pdate

David hat vollkommen recht, der Vollständigkeit halber füge ich hier den Aufzählungspunkt +1 für David ein!

  • Der Prozess ist der Vordergrundprozess.
  • Der Prozess wurde durch den Vordergrundprozess gestartet.
  • Der Prozess hat das letzte Eingabeereignis empfangen.
  • Es gibt keinen Vordergrundprozess.
  • Der Vordergrundprozess wird debuggt.
  • Der Vordergrund ist nicht gesperrt (siehe LockSetForegroundWindow).
  • Das Zeitlimit für die Vordergrundsperre ist abgelaufen (siehe SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo).
  • Es sind keine Menüs aktiv.
52
Dennis Smit

das funktioniert:

if (WindowState == FormWindowState.Minimized)
    WindowState = FormWindowState.Normal;
else
{
    TopMost = true;
    Focus();
    BringToFront();
    TopMost = false;
}
20
lupok

Bevor ich auf diesen Beitrag gestoßen bin, habe ich mir diese Lösung ausgedacht - um die TopMost-Eigenschaft umzuschalten:

this.TopMost = true;
this.TopMost = false;

Ich habe diesen Code im Konstruktor meines Formulars, zB:

public MyForm()
{
    //...

    // Brint-to-front hack
    this.TopMost = true;
    this.TopMost = false;

    //...
}
17
Blaker

Ich verwende SwitchToThisWindow, um die Anwendung wie folgt in den Vordergrund zu rücken:

static class Program
{
    [DllImport("User32.dll", SetLastError = true)]
    static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);



    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        bool createdNew;
        int iP;
        Process currentProcess = Process.GetCurrentProcess();
        Mutex m = new Mutex(true, "XYZ", out createdNew);
        if (!createdNew)
        {
            // app is already running...
            Process[] proc = Process.GetProcessesByName("XYZ");

            // switch to other process
            for (iP = 0; iP < proc.Length; iP++)
            {
                if (proc[iP].Id != currentProcess.Id)
                    SwitchToThisWindow(proc[0].MainWindowHandle, true);
            }

            return;
        }

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new form());
        GC.KeepAlive(m);

    }
6
Jim Lahman