如何在同一应用程序的所有窗口的顶部显示一个窗口

时间:2017-06-16 13:37:06

标签: c# winforms

我有一个SplashScreen应该显示在应用程序中所有其他窗口的前面。

由于它是SplashScreen,因此不能是模态对话框。相反,这应该通过其他线程来显示。

我以这种方式创建启动画面:

            SplashScreenForm = new SplashScreen(mainForm);
            // SplashScreenForm.TopMost = true;

为了显示它,我正在使用此调用,从另一个线程调用:

Application.Run(SplashScreenForm);

如果我取消注释SplashScreenForm.TopMost = true,则会在其他窗口的顶部显示启动画面,即使在属于不同应用程序的窗口顶部也是如此。

如果您想知道如何创建线程:

    public void ShowSplashScreen()
    {
        SplashScreenThread = new Thread(new ThreadStart(ShowForm));
        SplashScreenThread.IsBackground = true;
        SplashScreenThread.Name = "SplashScreenThread";
        SplashScreenThread.Start();
    }

    private static void ShowForm()
    {
        Application.Run(SplashScreenForm);
    }

我该怎么做?

2 个答案:

答案 0 :(得分:1)

类似的东西:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    Thread splashThread = new Thread(new ThreadStart(
        delegate
        {
            splashForm = new SplashForm();
            Application.Run(splashForm);
        }
        ));

    splashThread.SetApartmentState(ApartmentState.STA);
    splashThread.Start();

    // Load main form and do lengthy operations
    MainForm mainForm = new MainForm();
    mainForm.Load += new EventHandler(mainForm_Load);
    Application.Run(mainForm);
}

然后在耗时的操作结束之后:

static void mainForm_Load(object sender, EventArgs e)
{
    if (splashForm == null)
        return;
    splashForm.Invoke(new Action(splashForm.Close));
    splashForm.Dispose();
    splashForm = null;
}

这将在主表单之前启动启动画面,并且只有在mainForm_Load中完成冗长的操作时才会将其关闭。

答案 1 :(得分:0)

您可以尝试从SetForegroundWindow(HWND)调用函数WinAPI

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);

// somewhere in the code :
SetForegroundWindow(SplashScreenForm.Handle);