如何将我的应用程序窗口置于前面?

时间:2011-03-12 12:51:55

标签: c# .net winforms

如何将我的应用程序窗口置于前面?例如,我的应用程序需要注意。

这是我的个人计划。我需要这个功能。

这就是我得到的。但它工作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);

按“接受”按钮后,bool ready设置为true。

我工作得很好,但并非总是如此。

7 个答案:

答案 0 :(得分:149)

这是一段适合我的代码

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

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

答案 1 :(得分:52)

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

答案 2 :(得分:52)

虽然我同意所有人的意见,但这是不太好的行为,这是代码:

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


SetForegroundWindow(Handle.ToInt32());

<强>更新

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

  • 这个过程是前景 过程
  • 这个过程是由...开始的 前景过程。
  • 该过程收到了最后一个输入 事件
  • 没有前台进程。
  • 前台进程正在进行中 调试。
  • 前景未锁定(请参阅 LockSetForegroundWindow)。
  • 前台锁定超时有 过期(见 SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo)。
  • 没有菜单处于活动状态。

答案 3 :(得分:31)

使用Control.BringToFront

myForm.BringToFront();

答案 4 :(得分:20)

这有效:

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

答案 5 :(得分:17)

在绊倒这篇文章之前,我提出了这个解决方案 - 切换TopMost属性:

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

我在我的表单的构造函数中有这个代码,例如:

public MyForm()
{
    //...

    // Brint-to-front hack
    this.TopMost = true;
    this.TopMost = false;

    //...
}

答案 6 :(得分:6)

我使用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);

    }