我如何知道WPF窗口的监视器

时间:2010-03-17 20:30:01

标签: c# .net wpf

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

6 个答案:

答案 0 :(得分:26)

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

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

答案 1 :(得分:8)

目前为止提供的其他答复并未涉及问题的WPF部分。这是我的看法。

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

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

添加对System.Windows.FormsSystem.Drawing

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

请注意,如果你是一个挑剔的人,你可能已经注意到,在某些情况下,这个代码可能会有一个像素的右边和底部坐标,在某些情况下是双向int转换。但既然你是一个挑剔的人,你会非常乐意修改我的代码; - )

答案 2 :(得分:3)

为此,您需要使用一些原生方法。

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;

答案 3 :(得分:0)

查看How do I find what screen the application is running on in C#
另外Run Application on a Dual Screen Environment有一个有趣的解决方案:

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

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

答案 4 :(得分:0)

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;
     */
}

答案 5 :(得分:-1)

您可以使用Screen.FromControl方法获取当前表单的当前屏幕,如下所示:

Screen screen = Screen.FromControl(this);

然后,您可以查看Screen.Primary以查看当前屏幕是否为主屏幕。