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

Comment mettre en avant la fenêtre de mon application? Par exemple, 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 cela ne fonctionne PAS 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 = ssortingng.Empty; System.Media.SystemSounds.Beep.Play(); } } public void BringToBackAfterEnterCaptha() { if (InvokeRequired) { Invoke(new Action(BringToBackAfterEnterCaptha)); } else { this.TopMost = false; } } 

Et je les appelle du travailleur de fond.

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

Et après avoir appuyé sur “Accepter”, le bouton bool ready est défini sur true.

Je travaille très bien mais pas toujours.

Utilisez Control.BringToFront :

 myForm.BringToFront(); 

Voici un morceau de code qui a fonctionné pour moi

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

Il amène toujours la fenêtre souhaitée devant tous les autres.

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

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

Mettre à jour

David a complètement raison, pour être complet, j’inclus le point ici +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 au 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 locking du premier plan a expiré (voir SPI_GETFOREGROUNDLOCKTIMEOUT dans SystemParametersInfo).
  • Aucun menu n’est actif.

Utilisez les Form.Activate() ou Form.Focus() .

cela marche:

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

Avant de tomber sur ce post, je suis venu avec 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; //... } 

J’utilise SwitchToThisWindow pour mettre 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); ///  /// The main entry point for the application. ///  [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); }