【发布时间】:2017-10-20 17:35:09
【问题描述】:
我想防止用户在同一台机器上多次运行我的应用程序,所以我使用了来自该线程的解决方案:What is the correct way to create a single-instance application?
这工作正常,但在打开模式窗口时显示我的应用程序时出现问题(例如使用view.ShowDialog();)。这是一个场景:
- 用户运行我的应用程序并打开一个模式窗口。
- 然后他再次尝试运行我的应用程序,该应用程序的第二个实例的启动过程中的代码发现另一个正在运行的应用程序并向其广播 WM_SHOWME 消息以显示它自己。然后应用程序的第二个实例终止。
- 第一个应用程序接收到 WM_SHOWME 消息(使用来自How to handle WndProc messages in WPF? 的解决方案)。现在它应该把最顶层的窗口放在前面,这是我的问题——如果最顶层的窗口是模态的,甚至没有激活,我怎么能得到我的应用程序的最顶层窗口?我尝试了Refer to active Window in WPF? 的解决方案,但当然我的窗口没有激活,所以这不起作用。
PS - 当应用程序正在运行并打开一个模式窗口并且当我将鼠标悬停在任务栏中的图标上时,我可以看到两个窗口 - 主窗口和一个模式窗口。我可以单击主窗口(这当然是禁用的,因为它上面有一个模态窗口),我也可以单击模态窗口。我的解决方案就像我单击主窗口一样工作,但我希望它能够激活最上面的窗口,在这种情况下是模态的。
那么,知道如何将最顶部的模态窗口(或主窗口,如果没有显示模态窗口)放在前面吗?
【问题讨论】:
-
嗯,任务栏是否有意同时显示主窗口的图标和模式窗口(对话框)?这听起来像对话框不属于主窗口。如果您使对话框归主窗口所有,则该对话框将永远不会被主窗口覆盖。这也有这样的效果,当将主窗口带到前面时,模态窗口也将被带到前面。 (检查模态窗口的Owner property。它应该设置为主窗口。)
-
@elgonzo - 你是对的,我忘了设置 Owner 属性,谢谢!如果您发表评论作为答案,我会接受。
-
完成了... :)
标签: c# .net wpf modal-dialog single-instance