Come posso portare la finestra dell’applicazione in primo piano?

Come portare in primo piano la finestra dell’applicazione? Ad esempio, se la mia app richiede attenzione.

Questo è per il mio programma personale. Ho bisogno di quella funzionalità.

Questo è quello che ho ottenuto. Ma NON funziona al 100%.

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

E li chiamo da addetto al background.

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

E dopo aver premuto il pulsante “Accetta”, bool ready è impostato su true.

Io lavoro alla grande ma non sempre.

Usa Control.BringToFront :

 myForm.BringToFront(); 

Ecco un pezzo di codice che ha funzionato per me

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

Porta sempre la finestra desiderata davanti a tutti gli altri.

Mentre sono d’accordo con tutti, questo è un comportamento non piacevole, ecco il codice:

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

Aggiornare

David ha perfettamente ragione, per completezza includo il punto elenco qui +1 per David!

  • Il processo è il processo in primo piano.
  • Il processo è stato avviato dal processo in primo piano.
  • Il processo ha ricevuto l’ultimo evento di input.
  • Non c’è processo in primo piano.
  • Il processo in primo piano è in fase di debug.
  • Il primo piano non è bloccato (vedi LockSetForegroundWindow).
  • Il timeout del blocco in primo piano è scaduto (consultare SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo).
  • Nessun menu è attivo.

Utilizzare i metodi Form.Activate() o Form.Focus() .

questo funziona:

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

Prima di inciampare su questo post, mi è venuta in mente questa soluzione – per triggersre la proprietà TopMost:

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

Ho questo codice nel costruttore del mio modulo, ad esempio:

 public MyForm() { //... // Brint-to-front hack this.TopMost = true; this.TopMost = false; //... } 

Io uso SwitchToThisWindow per portare l’applicazione in primo piano come in questo esempio:

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