如果它是模态和非活动的,如何获得最顶层的窗口

时间:2017-05-20 18:36:05

标签: c# .net wpf modal-dialog single-instance

我想阻止用户在同一台​​机器上多次运行我的应用程序,所以我使用了这个帖子的解决方案:What is the correct way to create a single-instance application?

这样可行,但在打开模态窗口时显示我的应用程序时出现问题(例如使用Array ( [0] => Array ( [size] => 40x80x1.15x6M [weight] => 12800 [piece_per_bundle] => 50 [total_bundle] => 20 [total_piece] => 1000 [total_quantity_(MTs)] => 12800 [tanggal_plan_masuk] => 01-05-2017 [nama_file] => PACKING LIST 68 LOT 1 WITH COLORS MARK.xlsx [urut] => 1 [row] => 34 [container] => SITU9026744 [seal] => SITC853014 ) [1] => Array ( [size] => 40x60x1.15x6M [weight] => 10630 [piece_per_bundle] => 50 [total_bundle] => 10 [total_piece] => 500 [total_quantity_(MTs)] => 5315 [tanggal_plan_masuk] => 01-05-2017 [nama_file] => PACKING LIST 68 LOT 1 WITH COLORS MARK.xlsx [urut] => 2 [row] => 35 [container] => SITU9026744 [seal] => SITC853014 ) [2] => Array ( [size] => 19x19x0.92x6M [weight] => 3160 [piece_per_bundle] => 100 [total_bundle] => 12 [total_piece] => 1200 [total_quantity_(MTs)] => 3792 [tanggal_plan_masuk] => 01-05-2017 [nama_file] => PACKING LIST 68 LOT 1 WITH COLORS MARK.xlsx [urut] => 3 [row] => 36 [container] => SITU9026744 [seal] => SITC853014 ) ) )。这是一个场景:

  1. 用户运行我的应用程序并打开一个模态窗口。
  2. 然后他尝试再次运行我的应用程序,该应用程序的第二个实例的启动过程中的代码找到另一个运行的应用程序并向其广播WM_SHOWME消息以显示它自己。然后,应用程序的第二个实例终止。
  3. 第一个应用程序收到WM_SHOWME消息(使用How to handle WndProc messages in WPF?中的解决方案)。现在它应该把最顶层的窗口放在前面,这是我的问题 - 如果最顶层的窗口是模态的,甚至没有活动,我如何才能获得应用程序的最顶层窗口?我尝试使用Refer to active Window in WPF?的解决方案,但当然我的窗口没有活动,所以这不起作用。
  4. PS - 当应用程序运行并打开模态窗口时,当我将鼠标悬停在任务栏中的图标上时,我可以看到两个窗口 - 主窗口和模态窗口。我可以点击主窗口(这当然是禁用的,因为模态窗口在它上面)我也可以点击模态窗口。我的解决方案就像我点击主窗口一样,但我希望它能够激活最顶层的窗口,在这种情况下是模态的。

    那么,任何想法如何将最上面的模态窗口(或主窗口,如果没有显示模态窗口)带到前面?

2 个答案:

答案 0 :(得分:1)

问题中描述的行为表明主窗口不拥有对话框。

请注意,当某个对话框由(主)窗口拥有时,该窗口无法覆盖该对话框(该对话框通常始终位于窗口顶部)。 这也会产生这样的效果:当窗口移到前面时,对话框也会被带到窗口的正面 - 这样可以很好地解决你遇到的问题。

设置对话框(模态窗口)的所有者非常简单。在显示对话框之前,只需将其Owner属性设置为主窗口,类似于此示例:

Window modalWindow = ... create modal window instance
modalWindow.Owner = mainWindow;
modalWindow.ShowDialog();

(旁注:如果还希望任务栏中只显示主窗口的图标/缩略图,则模态窗口的ShowInTaskbar属性应设置为false 。)

答案 1 :(得分:0)

使应用程序成为计算机上的单个实例的最佳解决方案是使用命名互斥锁

Mutex

以下是相同文档的摘录

  

互斥锁有两种类型:本地互斥锁(未命名)和命名系统互斥锁。本地互斥锁仅存在于您的进程中。它可以被进程中的任何线程使用,该线程具有对表示互斥锁的Mutex对象的引用。每个未命名的Mutex对象代表一个单独的本地互斥锁。   命名系统互斥体在整个操作系统中都是可见的,可用于同步进程的活动。

     

您可以使用接受名称的构造函数创建表示命名系统互斥锁的Mutex对象。操作系统对象可以同时创建,也可以在创建Mutex对象之前存在。您可以创建表示同一命名系统互斥锁的多个互斥锁对象,并且可以使用OpenExisting方法打开现有的命名系统互斥锁。

而且,无论如何,你已经处理了你想要推出第一个实例的情况。