我创建了单实例应用程序。它接受命令行参数并处理它们。如果应用程序已在运行,则会打开一些对话框(打开的文件或消息框)。现在,如果我尝试传递命令行参数,我需要检查是否显示对话框。所以我添加了这段代码。
if (!Application.Current.MainWindow.IsActive)
{
Application.Current.MainWindow.Activate();
}
if (Keyboard.FocusedElement != null)
{
// If focused element is not null it means no other dialog is shown.
// safe to go.
}
理想就好了,如果聚焦元素不为null则表示焦点在窗口内,没有显示其他对话框。
在正常情况下,当窗口未最小化时,此代码可正常工作。但如果窗口最小化,则条件失败,因为键盘焦点不在窗口中。
你找到任何通用的解决方案吗?我可以通过在每个对话框之前添加标志来实现此目的。但我有10个以上的对话框。将来我可能会添加更多对话框。
由于
答案 0 :(得分:5)
很老的问题,但我最近遇到了类似的问题。 以下是我解决它的方法:
public static bool IsAnyModalOpened()
{
return Application.Current.Windows.OfType<Window>().Any(IsModal);
}
public static bool IsModal(this Window window)
{
var fieldInfo = typeof(Window).GetField("_showingAsDialog", BindingFlags.Instance | BindingFlags.NonPublic);
return fieldInfo != null && (bool)fieldInfo.GetValue(window);
}