切换到应用程序后激活模态窗口

问题描述:

我们有一个包含模态和非模态窗口的C#应用​​程序。用户可能会打开几个非模态窗口,并从其中一个窗口打开模态窗口。切换到应用程序后激活模态窗口

如果用户切换到另一个应用程序,然后通过单击任务栏中的其中一个非模态窗口(除了打开模态窗口的窗口之外)切换回我们的窗口,则非模态窗口将变为激活状态,但是不接受输入,因为模式窗口已打开,但位于其他窗口之后。

我们如何确保无论用户切换到哪个窗口,模态的哪个窗口都是实际激活的窗口?例如,这是Microsoft Outlook展现的行为。

任何援助将不胜感激。

+0

我认为这是可能的,但有多个窗口的设计? – 2009-11-26 05:17:17

+0

有多个窗口打开和混合模式是非常相关的,正如所指出的那样,使得行为与您期望的模式窗口行为一样不重要。 – TheZenker 2011-03-15 12:53:51

它当然有可能,但真的很烦人。我经常在一个混合了模态窗口和非模态窗口的应用程序上工作。这是我的策略(这是不是100%全保护)

  1. 设置模式窗口TOPMOST时 可能。
  2. 当某些动作检测到 (如按下windows-d按钮), 时,您必须手动将窗口 重新设置回顶端。我不知道为什么窗户背后,但行为是不一致的Windows XP之间,Vista的,2003年等。

它真的很烦人维护重新安排窗口的代码。我会敦促你尽量不要混用模态窗口和非模态窗口。

编辑

我忘了提,我使用WTL和原生Win32函数很多。我也尝试创建具有父/子关系的窗口,以便键盘和鼠标消息尽可能地反射到子窗口。

+0

我可以理解你的痛苦:P – 2009-11-26 06:19:29

+0

谢谢你的回应。 我添加了一些代码来拦截WM_ACTIVATEAPP窗口消息,如MSDN上NativeWindow类的示例中所述,并在发生这种情况时激活最上面的模式窗口,这似乎会产生所需的行为。 你对这种方法有什么想法吗? – 2009-11-27 06:55:44