2009-07-17 68 views
2

Windows窗体的新形式,.NET 2.0创建具有相同的z顺序为另一种形式

我的主应用程序线程具有形式(A)。我有一个后台线程,它使用定时器来确定一个活动已经发生 - 当它发生时,它会导致主应用程序窗体隐藏(使用BeginInvoke),并在其自己的线程中创建一个新窗体(B)(单独消息泵)。

这两个线程的事情听起来很复杂,但不幸的是它需要。

新消息泵上的新窗体显示在非最高窗体的顶部(如您所期望的那样)。但是,如果原始应用程序不在桌面上,这是非常烦人的。

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

任何想法?

[如果在当前用户桌面上(也就是没有密码),这也会产生B屏幕保护程序的副作用,如果我无法修复它,我会如何处理想避免这个...]

+0

我很好奇,听说过有背后的推理在它自己的线程上的第二种形式。我已经看到无数次开发人员相信他们需要“多线程”表单,直到有人要求他们解释为什么而他们不能。我并不是说没有这种情况,但更多的时候是用户采用错误的方法。 – 2009-07-17 14:09:11

+0

主线程是一个复杂的LOB应用程序,它包含许多窗体,子窗体等。第二个线程是一个安全过程,它通过隐藏所有窗体,包括当前对话框来“锁定”主应用程序,以后可以恢复它。其中一些表格是由我们不能控制的第三方库创建的。如果从设计的第一天开始就存在安全要求,那么第二个应用程序泵可能不是必需的,但这确实意味着该锁“通用”足以处理第三方表格等。 – 2009-07-17 14:34:54

+0

您是否尝试将对话框转发使用.ShowDialog(Me)或.ShowDialog(this)。将ShowDialog与对父项的引用一起使用可以锁定来自任何输入的父窗体,并防止允许对焦。 – 2009-07-17 16:20:38

回答

1

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

我也用nobugz建议,以确定应用程序是否是焦点应用,如果不是我用ShowWithoutActivation覆盖,以确保我的新形式不启动激活

0

AFAIK,你可以调用Form.Activate()把它带到前面,但我不知道WinForms中的Windows级别的z顺序。在Win32中你可能会有更好的运气。