Как узнать, какой монитор находится в окне WPF?

В приложении С#, как я могу узнать, есть ли окно WPF на основном мониторе или другом мониторе?

Ответ 1

Если окно максимизировано, вы не можете полагаться на window.Left или window.Top вообще, так как они могут быть координатами до того, как они будут максимальными. Но вы можете сделать это во всех случаях:

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

Ответ 2

Другие ответы, имеющиеся до сих пор, не затрагивают часть вопроса WPF. Вот мой прием.

WPF, похоже, не раскрывает подробную информацию о экране, как показано в классе Windows Forms Screen, упомянутом в других ответах.

Однако вы можете использовать класс экрана WinForms в вашей программе WPF:

Добавьте ссылки на 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));

Обратите внимание, что если вы nitpicker, вы, возможно, заметили, что этот код может иметь правую и нижнюю координаты на одном пикселе в случае преобразования double в int. Но так как вы nitpicker, вы будете более чем счастливы исправить мой код: -)

Ответ 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;

Ответ 4

Вы можете использовать метод Screen.FromControl, чтобы получить текущий экран для текущей формы следующим образом:

Screen screen = Screen.FromControl(this);

Затем вы можете проверить Screen.Primary, чтобы увидеть, является ли текущий экран основным.

Ответ 6

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