我怎么知道什么监视器的WPF窗口

在C#应用程序中,如何查找WPF窗口是否在主监视器或另一个监视器中?

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

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

迄今为止可用的其他答复不涉及问题的WPF部分。 这是我的要求

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

但是,您可以在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)); 

请注意,如果您是nitpicker,您可能已经注意到,在某些情况下,double-int转换可能会将此代码的右和底坐标closures一个像素。 但是既然你是一个挑剔的人,你会更乐意修复我的代码;-)

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

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; 

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

 Screen screen = Screen.FromControl(this); 

然后你可以检查Screen.Primary来查看当前屏幕是否是主屏幕。

看看如何find在C#中运行应用程序的屏幕
同时在双屏幕上运行应用程序环境有一个有趣的解决scheme:

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

“这”是你的应用程序的主要forms。

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