如果它是模态且不活动的,如何获得最上面的 window

How to get the topmost window if it is modal and inactive

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

这工作正常,但是当打开模态 window(例如 view.ShowDialog();)时,我的应用程序显示有问题。这是一个场景:

  1. 用户 运行 访问我的应用程序并打开模式 window。
  2. 然后他再次尝试 运行 我的应用程序,应用程序第二个实例的启动过程中的代码找到另一个应用程序 运行ning 并广播 WM_SHOWME 消息到它展示它自己。然后应用程序的第二个实例终止。
  3. 第一个应用程序收到 WM_SHOWME 消息(使用 How to handle WndProc messages in WPF?). Now it should bring the topmost window to front, and this is my question - how can I get the topmost window of my application if the topmost window is modal and not even active? I tried with the solution from Refer to active Window in WPF? 的解决方案,但当然我的 windows 未激活,所以这不起作用。

PS - 当应用程序 运行ning 并且模式 window 打开时,当我将鼠标悬停在任务栏中的图标上时,我可以看到两个 windows - 主要 window 和模态 window。我可以点击主要的 window(这当然是禁用的,因为模态 window 在它上面),我也可以点击模态 window。我的解决方案就像单击主 window 一样工作,但我希望它能够激活最上面的 window,在这种情况下它是模态的。

那么,知道如何将最上面的模态 window(如果没有显示模态 windows 则为主要 window)放在前面吗?

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

Mutex

这是同一文档的摘录

Mutexes are of two types: local mutexes, which are unnamed, and named system mutexes. A local mutex exists only within your process. It can be used by any thread in your process that has a reference to the Mutex object that represents the mutex. Each unnamed Mutex object represents a separate local mutex. Named system mutexes are visible throughout the operating system, and can be used to synchronize the activities of processes.

You can create a Mutex object that represents a named system mutex by using a constructor that accepts a name. The operating-system object can be created at the same time, or it can exist before the creation of the Mutex object. You can create multiple Mutex objects that represent the same named system mutex, and you can use the OpenExisting method to open an existing named system mutex.

而且,不管怎样,你已经处理了你想要推进一审的案件。

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

请注意,当(主要)window 拥有一个对话框时,window 无法覆盖该对话框(该对话框通常始终位于 window 之上). 这也有这样的效果,即当将 window 置于最前面时,对话框也将置于 window 之上的最前面——这将巧妙地解决您遇到的问题。

设置对话框的所有者(模态 window)相当容易。在显示对话框之前,只需将其 Owner 属性 设置为您的 main window,类似于此示例:

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

(旁注:如果还希望只有主window的icon/thumbnail出现在任务栏中,那么ShowInTaskbar属性模态 window 应设置为 false。)