我怎样才能把我的应用程序窗口放在前面?
如何把我的应用程序窗口放在前面? 例如我的应用程序需要注意。
这是我的个人计划。 我需要这个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。
我会发表这个评论,但是这个问题太重要了。