在关闭不同线程(C#)时,在其他窗口后面发送的应用程序窗口

本文关键字:窗口 其他 应用程序 线程 | 更新日期: 2023-09-27 17:48:48

我正在用C#.NET 编写一个Windows窗体应用程序

启动时,应用程序会显示一个在单独线程中运行的启动屏幕。当启动屏幕显示时,主应用程序正在初始化。

一旦主应用程序完成初始化,就会显示应用程序的主窗体,并且启动屏幕仍然显示在顶部。

到目前为止一切都如预期。

然后,Splash屏幕关闭,导致该线程退出。出于某种原因,在这一点上,主应用程序窗口被发送到所有其他打开的窗口之后,尤其是在windows资源管理器窗口中,您首先单击了.exe文件来运行应用程序!

是什么原因导致窗户突然像这样"向后"跳?

在关闭不同线程(C#)时,在其他窗口后面发送的应用程序窗口

当线程关闭时,尝试在主窗口上调用.Activate()。

它从未处于活动状态,因此Z阶较低,所以任何较高的值都会自然高于它。我不得不在我们的应用程序中修复这个确切的场景。

别忘了!您可能需要使用Invoke()将调用封送至正确的线程!

我有时也会遇到这种情况。Bob的回答是最简单的,在大多数情况下对我都有效。然而,有些时候我需要使用暴力。通过互操作这样做:

[DllImport("user32.dll")]public static extern bool SetForegroundWindow(IntPtr hWnd);

启动屏幕是模式对话框吗?

如果您通过设置DialogResult和调用Hide()或close()来两次关闭模态对话框,我已经看到这个窗口"跳跃"了。

代码如下:

private void button1_Click(object sender, System.EventArgs e)
{
     this.DialogResult = DialogResult.Abort;
     this.Hide();
}

查看此博客条目了解所有案例。。。

您可以使用以下代码:

private void button1_Click(object sender, System.EventArgs e)
{
     this.DialogResult = DialogResult.Abort;
     this.Hide();
}

谢谢大家!