请参阅WPF中的活动窗口?

pka*_*ain 55 c# wpf window

如何使用WinForms中的ActiveForm属性来引用C#中的活动Window of WPF应用程序?

Avi*_* P. 95

一种可能的方法是扫描应用程序中打开的窗口列表,并检查它们中的哪一个IsActive = true:

Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);
Run Code Online (Sandbox Code Playgroud)

例如,如果显示模式对话框,则不确定是否存在多个活动窗口,在这种情况下,对话框的所有者和对话框本身可能处于活动状态.

  • 为了使它更健壮,你也可以使用`FirstOrDefault`而不是`SingleOrDefault`,如果有多个匹配项,它会抛出异常.此外,它应该更快一点,因为它接受第一个结果,而不需要检查它是唯一的结果. (5认同)
  • 再看一下我的旧答案,最好使用`OfType <Window>()`运算符而不是`Cast <Window>()`以防万一... (2认同)

gho*_*ord 22

使用PInvoke有更好的方法.Aviads答案不是一直有效(有一些边缘情况有对话框).

IntPtr active = GetActiveWindow();

ActiveWindow = Application.Current.Windows.OfType<Window>()
    .SingleOrDefault(window => new WindowInteropHelper(window).Handle == active);
Run Code Online (Sandbox Code Playgroud)

首先必须包括以下导入:

[DllImport("user32.dll")]
static extern IntPtr GetActiveWindow();
Run Code Online (Sandbox Code Playgroud)

  • 你能详细说明边缘案例是什么吗? (6认同)
  • @nchaud 我正在使用 AvalonDock,它允许您将工作区从主窗口拖到新窗口中。但是,这些窗口也标记为“IsActive”。使用另一种解决方案会引发异常(如果有多个匹配谓词,则会引发“SingleOrDefault”),或者在使用“FirstOrDefault”时没有给我实际的活动窗口 (2认同)