我如何知道 WPF 窗口位于哪个监视器中

问题描述 投票:0回答:8

在 C# 应用程序中,如何确定 WPF 窗口是在主监视器还是另一个监视器中?

c# .net wpf
8个回答
36
投票

如果窗口最大化,那么您根本不能依赖 window.Left 或 window.Top 因为它们可能是最大化之前的坐标。但在所有情况下你都可以这样做:

    var screen = System.Windows.Forms.Screen.FromHandle(
       new System.Windows.Interop.WindowInteropHelper(window).Handle);

11
投票

到目前为止可用的其他答复并未解决问题的 WPF 部分。这是我的看法。

WPF 似乎没有公开其他回复中提到的 Windows 窗体 Screen 类中找到的详细屏幕信息。

但是,您可以在 WPF 程序中使用 WinForms Screen 类:

添加对

System.Windows.Forms
System.Drawing

的引用
var screen = System.Windows.Forms.Screen.FromRectangle(
  new System.Drawing.Rectangle(
    (int)myWindow.Left, (int)myWindow.Top, 
    (int)myWindow.Width, (int)myWindow.Height));

请注意,如果您是一个吹毛求疵的人,您可能已经注意到,在某些 double 到 int 转换的情况下,此代码的右侧和底部坐标可能会相差一个像素。但既然你是一个吹毛求疵的人,你会非常乐意修复我的代码;-)


7
投票

为了做到这一点,您需要使用一些本机方法。

https://msdn.microsoft.com/en-us/library/windows/desktop/dd145064(v=vs.85).aspx

internal static class NativeMethods
{
    public const Int32 MONITOR_DEFAULTTOPRIMARY = 0x00000001;
    public const Int32 MONITOR_DEFAULTTONEAREST = 0x00000002;

    [DllImport( "user32.dll" )]
    public static extern IntPtr MonitorFromWindow( IntPtr handle, Int32 flags );
}

然后您只需检查您的窗口是哪个监视器以及哪个是主窗口。像这样:

        var hwnd = new WindowInteropHelper( this ).EnsureHandle();
        var currentMonitor = NativeMethods.MonitorFromWindow( hwnd, NativeMethods.MONITOR_DEFAULTTONEAREST );
        var primaryMonitor = NativeMethods.MonitorFromWindow( IntPtr.Zero, NativeMethods.MONITOR_DEFAULTTOPRIMARY );
        var isInPrimary = currentMonitor == primaryMonitor;

1
投票
public static bool IsOnPrimary(Window myWindow)
{
    var rect = myWindow.RestoreBounds;
    Rectangle myWindowBounds= new Rectangle((int)rect.X, (int)rect.Y, (int)rect.Width, (int)rect.Height);
    return myWindowBounds.IntersectsWith(WinForms.Screen.PrimaryScreen.Bounds);

    /* Where
        using System.Drawing;
        using System.Windows;
        using WinForms = System.Windows.Forms;
     */
}

0
投票

查看如何在 C# 中找到应用程序正在哪个屏幕上运行
另外在双屏环境上运行应用程序有一个有趣的解决方案:

bool onPrimary = this.Bounds.IntersectsWith(Screen.PrimaryScreen.Bounds);

其中“this”是您申请的主要形式。


0
投票

您可以使用此代码:

if (Screen.AllScreens.Length < 2)
{
    Console.WriteLine("You have just one monitor!");
    return;
}

string primaryMonitor = "";
string currentMonitor = Screen.FromHandle(new WindowInteropHelper(this).Handle).DeviceName;

for (int i = 0; i < Screen.AllScreens.Length; i++)
{
    if (Screen.AllScreens[i].Primary == true)
    {
        primaryMonitor = Screen.AllScreens[i].DeviceName;
    }
}

if (currentMonitor == primaryMonitor)
{
    Console.WriteLine($"Window is in primary monitor ({primaryMonitor})");
}
else
{
    Console.WriteLine($"Window is in ({currentMonitor}) and primary monitor is ({primaryMonitor})");
}

但是,可能有更短的方法来获取主监视器。


0
投票

这对我有用。我一直在寻找解决方案,以在多显示器多分辨率设置中正确最大化窗口。这就是我获得主屏幕的方式。

 //Get the screen that the window is currently on
  System.Windows.Forms.Screen currentScreen = System.Windows.Forms.Screen.FromHandle(new System.Windows.Interop.WindowInteropHelper(<<your System.Windows.Window instance>>).Handle);

  if (currentScreen.Primary)
  {
      //do something
  }

-1
投票

您可以使用

Screen.FromControl
方法来获取当前表单的当前屏幕,如下所示:

Screen screen = Screen.FromControl(this);

然后您可以检查

Screen.Primary
来查看当前屏幕是否为主屏幕。

© www.soinside.com 2019 - 2024. All rights reserved.