Como posso levar a janela da minha aplicação para a frente?

Como levar a janela da minha aplicação para frente? Por exemplo, o meu aplicativo precisa de atenção.

Isto é para o meu programa pessoal. Eu preciso dessa funcionalidade.

Isso é o que eu tenho. Mas não está funcionando 100% vezes.

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 eu os chamo de trabalhador de segundo plano.

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

E depois de pressionar o botão “Aceitar” bool pronto está definido como verdadeiro.

Eu trabalho muito, mas nem sempre.

Use Control.BringToFront :

 myForm.BringToFront(); 

Aqui está um pedaço de código que funcionou para mim

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

Ele sempre traz a janela desejada para a frente de todos os outros.

Embora eu concorde com todos, esse comportamento não é legal, aqui está o código:

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

Atualizar

David está completamente certo, por completude eu incluo o ponto de bala aqui +1 para David!

  • O processo é o processo de primeiro plano.
  • O processo foi iniciado pelo processo de primeiro plano.
  • O processo recebeu o último evento de input.
  • Não há processo de primeiro plano.
  • O processo em primeiro plano está sendo depurado.
  • O primeiro plano não está bloqueado (consulte LockSetForegroundWindow).
  • O tempo limite de bloqueio de primeiro plano expirou (consulte SPI_GETFOREGROUNDLOCKTIMEOUT em SystemParametersInfo).
  • Nenhum menu está ativo.

Use os methods Form.Activate() ou Form.Focus() .

isso funciona:

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

Antes de me deparar com este post, eu criei esta solução – para alternar a propriedade TopMost:

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

Eu tenho esse código no construtor do meu formulário, por exemplo:

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

Eu uso SwitchToThisWindow para trazer o aplicativo para a frente como neste exemplo:

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