将Windows窗体应用程序带到前台的"正确"方法是什么?

Red*_*ter 31 c# visual-studio-2008 winforms

我正在用C#编写Windows窗体应用程序.我需要能够把它带到前台.经过一些谷歌搜索和实验,我有一个看起来非常h​​acky的工作解决方案.

如果有的话,我想知道这样做的优雅方式.我需要应用程序恢复并前往前台,无论它是最小化,还是最小化,但在后台.

当前代码如下所示:

WindowState = FormWindowState.Minimized;
WindowState = FormWindowState.Normal;
BringToFront();
Focus();
Run Code Online (Sandbox Code Playgroud)

bob*_*mcr 51

你试过Form.Activate吗?

此代码似乎可以执行您想要的操作,如果最小化则将表单恢复为正常大小,然后激活它以设置焦点:

if (this.WindowState == FormWindowState.Minimized)
{
    this.WindowState = FormWindowState.Normal;
}

this.Activate();
Run Code Online (Sandbox Code Playgroud)

警告:这很烦人!如果它只是一个供您个人使用的应用程序,正如您所说,也许您可​​以忍受它.:)

  • 如果您最小化到系统托盘并且需要在窗口已处于正常状态时激活并将其置于最前面,这也很有用. (5认同)

Joh*_*ohn 11

注意.下面我复制了一个链接问题中投票最多的答案,该问题与此问题相同.答案是我发现解决这个问题的唯一纯粹的C#答案.

this.WindowState = FormWindowState.Minimized;
this.Show();
this.WindowState = FormWindowState.Normal;
Run Code Online (Sandbox Code Playgroud)

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

  • 奇怪的是,在一台机器上我只能使用`this.Activate()`.它不适用于另一台机器(理论上是相同的Windows 7版本).这个答案解决了这个问题. (2认同)

Jac*_*nev 8

private static class User32
{
    [DllImport("User32.dll")]
    internal static extern IntPtr SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    internal static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    internal static readonly IntPtr InvalidHandleValue = IntPtr.Zero;
    internal const int SW_MAXIMIZE = 3;
}
public void Activate()
{
    Process currentProcess = Process.GetCurrentProcess();
    IntPtr hWnd = currentProcess.MainWindowHandle;
    if (hWnd != User32.InvalidHandleValue)
    {
        User32.SetForegroundWindow(hWnd);
        User32.ShowWindow(hWnd, User32.SW_MAXIMIZE);
    }
}
Run Code Online (Sandbox Code Playgroud)


Joe*_*orn 5

您可以设置.TopMost为true,调用DoEvents(),然后设置.TopMost回false.它仍然是hackish,但如果Activate和Show不起作用,它比最小化/重新显示更好.

  • DoEvents 可能会导致各种令人讨厌的事情 - 我强烈建议不要使用它。 (2认同)
  • @JonCage绝对同意:http://stackoverflow.com/questions/11352301/how-to-use-doevents-without-being-evil/11352575#11352575 (2认同)