Windows 创建与另一个窗体具有相同z顺序的新窗体

Windows 创建与另一个窗体具有相同z顺序的新窗体,windows,winforms,Windows,Winforms,Windows窗体.net 2.0 我的主应用程序线程有一个表单(a)。我有一个后台线程,它通过一个计时器来确定一个活动是否已经发生——当它发生时,它会导致主应用程序表单隐藏(使用BeginInvoke),并在自己的线程中创建一个新表单(B)(单独的消息泵) 双线程的事情听起来很复杂,但不幸的是它是需要的 新消息泵上的新表单显示在非最顶层表单的顶部(如您所料!)。然而,如果原始应用程序不在桌面上,这是非常烦人的 所以,在隐藏之前,我想确定原始形式(A)的z顺序是什么;然后创建新表单(B),镜像原

Windows窗体.net 2.0

我的主应用程序线程有一个表单(a)。我有一个后台线程,它通过一个计时器来确定一个活动是否已经发生——当它发生时,它会导致主应用程序表单隐藏(使用BeginInvoke),并在自己的线程中创建一个新表单(B)(单独的消息泵)

双线程的事情听起来很复杂,但不幸的是它是需要的

新消息泵上的新表单显示在非最顶层表单的顶部(如您所料!)。然而,如果原始应用程序不在桌面上,这是非常烦人的

所以,在隐藏之前,我想确定原始形式(A)的z顺序是什么;然后创建新表单(B),镜像原始表单的z顺序

有什么想法吗


[这还有一个副作用,就是如果表单B在当前用户的桌面上(即未密码),它会在屏幕保护程序上弹出,如果我不能按照上面的方式修复它,我希望避免这种情况…]

好的,你可以调用form.Activate()将其放在前面,但我不知道WinForms中有Windows级别的z顺序。您在Win32中可能会更幸运。

我通过使用Win32 GetWindow函数来确定前一个窗口是我的主窗体,从而解决了这个问题。然后,当我在第二个线程上创建新表单时,我可以使用SetWindowPos将z顺序设置为我在第一步中获得的值


我还使用nobugz建议来确定应用程序是否是重点应用程序,如果不是,我使用ShowWithoutActivation覆盖来确保我的新表单不会启动激活

我很想听听您在自己的线程中使用第二个表单的原因。我见过无数次开发人员确信他们需要“多线程”他们的表单,直到有人要求他们解释为什么他们不能。我并不是说没有这样的理由,但通常情况下,用户的方法是错误的。主线程是一个复杂的LOB应用程序,包含许多表单、子表单等。第二个线程是一个安全过程,它通过隐藏所有表单“锁定”主应用程序,包括当前对话框,稍后可以恢复。其中一些表单是由我们无法控制的第三方库创建的。如果从设计的第一天起就存在安全性要求,则可能不需要第二个应用程序泵,但这确实意味着锁“通用”足以处理第三方表单。如果您尝试使用.ShowDialog(Me)或.ShowDialog(this)向前打开对话框。使用ShowDialog并引用父窗体将锁定父窗体,使其不受任何输入的影响,并阻止焦点被允许。是的,我不想把它放在前面-这就是重点。我认为我需要从Win32 p/调用某些东西,但我不知道是什么…似乎nobugz答案已被删除,因此此答案没有多大帮助:-(