我怎样才能把我的应用程序窗口放在前面?

如何把我的应用程序窗口放在前面? 例如我的应用程序需要注意。

这是我的个人计划。 我需要这个function。

这是我得到的。 但它不是 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; } } 

我从后台工作者那里打电话给他们。

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

并按下“接受”button布尔准备设置为true。

我工作很好,但并不总是。

使用Control.BringToFront

 myForm.BringToFront(); 

这是一段代码,为我工作

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

它总是把所需的窗口带到所有其他人的面前。

虽然我同意大家的意见,但这不是一个好的行为,代码如下:

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

更新

大卫是完全正确的,为了完整,我在这里包括了大卫点+1这个大卫!

  • 该过程是前台进程。
  • 该过程由前台进程启动。
  • 该进程收到最后一个input事件。
  • 没有前台进程。
  • 前台进程正在debugging。
  • 前景未被locking(请参阅LockSetForegroundWindow)。
  • 前台locking超时已过期(请参阅SystemParametersInfo中的SPI_GETFOREGROUNDLOCKTIMEOUT)。
  • 没有菜单处于活动状态

使用Form.Activate()Form.Focus()方法。

这工作:

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

在绊倒这篇文章之前,我想出了这个解决scheme – 切换TopMost属性:

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

我有这个代码在我的窗体的构造函数,例如:

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

我使用SwitchToThisWindow将应用程序带到最前面,如下例所示:

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

我的build议是:不要这样做! 需要注意的应用程序应该使任务栏闪烁 ,而不是跳到用户正在做的事情的前面,并开始拦截键和鼠标点击。 这是非常糟糕的forms。

我会发表这个评论,但是这个问题太重要了。