我有一个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);
}
我该怎么做?
答案 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);