web-dev-qa-db-fra.com

Comment puis-je amener ma fenêtre d'application au premier plan?

Comment amener ma fenêtre d'application au premier plan? Par exemple, quand mon application a besoin d'attention.

Ceci est pour mon programme personnel. J'ai besoin de cette fonctionnalité.

C'est ce que j'ai eu. Mais c'est PAS travailler 100% fois.

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

Et je les appelle d'ouvrier d'arrière-plan.

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

Et après avoir appuyé sur le bouton "Accepter", Bool Ready est défini sur true.

Je travaille bien mais pas toujours.

73
Hooch

Utilisation Control.BringToFront :

myForm.BringToFront();
34
Jon

Voici un morceau de code qui a fonctionné pour moi

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

Il apporte toujours la fenêtre souhaitée à l'avant de tous les autres.

156
Shabbir Hussain

Utilisez les méthodes Form.Activate() ou Form.Focus().

55
as-cii

Bien que je sois d’accord avec tout le monde, ce n’est pas un comportement gentil, voici le code:

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


SetForegroundWindow(Handle.ToInt32());

Mise à jour

David a tout à fait raison. Par souci d'exhaustivité, j'inclus ici le point de la balle +1 pour David!

  • Le processus est le processus de premier plan.
  • Le processus a été lancé par le processus de premier plan.
  • Le processus a reçu le dernier événement d'entrée.
  • Il n'y a pas de processus de premier plan.
  • Le processus de premier plan est en cours de débogage.
  • Le premier plan n'est pas verrouillé (voir LockSetForegroundWindow).
  • Le délai de verrouillage de premier plan a expiré (voir SPI_GETFOREGROUNDLOCKTIMEOUT dans SystemParametersInfo).
  • Aucun menu n'est actif.
52
Dennis Smit

cela marche:

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

Avant de trébucher sur ce post, j'ai proposé cette solution - pour basculer la propriété TopMost:

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

J'ai ce code dans le constructeur de mon formulaire, par exemple:

public MyForm()
{
    //...

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

    //...
}
17
Blaker

J'utilise SwitchToThisWindow pour amener l'application au premier plan comme dans cet exemple:

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