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

Hoo*_*och 77 .net c# 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我从背景工作者那里打电话给他们.

BringToFrontToEnterCaptha();
while (!ready)
{
    Thread.Sleep(100);
}
BringToBackAfterEnterCaptha();
Thread.Sleep(300);
Run Code Online (Sandbox Code Playgroud)

按"接受"按钮后,bool ready设置为true.

我工作得很好,但并不总是.

Sha*_*ain 160

这是一段对我有用的代码

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

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

  • 我发现使用谷歌的所有方法,每个人都不断坚持激活和关注哪里的关键.这是唯一对我有用的方法.谢谢你,因为我永远不会想到这个伎俩. (8认同)
  • 谢谢。到目前为止,在我找到的所有解决方案中,这是唯一一个似乎始终有效的解决方案。+1 (2认同)
  • 辉煌!唯一对我有用的东西.适用于WinForm.幸运的是,我可以最小化和恢复我的应用程序,因为它没有任何可见的UI.这在另一种情况下也很有用:http://stackoverflow.com/questions/257587/bring-a-window-to-the-front-in-wpf/4831839#4831839 (2认同)
  • `Activate()` 解决方案更好。同样在您的情况下,最好检查并记住“最大化”状态。否则,当最大化时,您会将其恢复为“正常”。 (2认同)

as-*_*cii 58

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

  • Form.Activate()可以自己运行 - 谢谢! (15认同)
  • “激活”确实使 Windows 将当前窗体置于操作系统中当前打开的任何其他应用程序的前面。另一方面,“放在前面”只会使所需的表格显示在当前应用程序中的其他表格之前(不是 O/S)。 (2认同)

Den*_*mit 55

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

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


SetForegroundWindow(Handle.ToInt32());
Run Code Online (Sandbox Code Playgroud)

更新

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

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

  • Form.Activate()调用SetForegroundWindow(),无需使用PInvoke. (9认同)
  • 阅读必须适用于此工作的[条件](http://msdn.microsoft.com/en-us/library/ms633539(VS.85).aspx)的项目符号列表. (4认同)

Jon*_*Jon 36

用途Control.BringToFront:

myForm.BringToFront();
Run Code Online (Sandbox Code Playgroud)

  • 这是错的.Control.BringToFront将控件带到托管控件的前面,例如,您可以在Label前面放置一个TextBox,以确保标签的空白不会遮挡TextBox的一部分.表单已从Control继承此表单,当它是MDI子项时,它可用于更改表单的z顺序 - 即表单托管在另一个表单中.它不会在另一个应用程序前面提供表单. (19认同)
  • 这不适合我. (11认同)
  • 如果应用程序没有输入焦点,这是否有效? (6认同)
  • Form.Activate()可以正常工作,在下面增加答案。 (3认同)

lup*_*pok 22

这工作:

if (WindowState == FormWindowState.Minimized)
    WindowState = FormWindowState.Normal;
else
{
    TopMost = true;
    Focus();
    BringToFront();
    TopMost = false;
}
Run Code Online (Sandbox Code Playgroud)


小智 18

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

this.TopMost = true;
this.TopMost = false;
Run Code Online (Sandbox Code Playgroud)

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

public MyForm()
{
    //...

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

    //...
}
Run Code Online (Sandbox Code Playgroud)


Jim*_*man 8

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

    }
Run Code Online (Sandbox Code Playgroud)