source

WPF 창이 어떤 모니터에 있는지 어떻게 알 수 있습니까?

manysource 2023. 5. 5. 09:55

WPF 창이 어떤 모니터에 있는지 어떻게 알 수 있습니까?

C# 응용 프로그램에서 WPF 창이 기본 모니터에 있는지 다른 모니터에 있는지 확인하려면 어떻게 해야 합니까?

창이 최대화되면 창에 의존할 수 없습니다.왼쪽 또는 창.최대화되기 전의 좌표일 수 있기 때문에 맨 위에 있습니다.그러나 모든 경우에 이 작업을 수행할 수 있습니다.

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

지금까지 사용 가능한 다른 답변은 질문의 WPF 부분을 다루지 않습니다.제 생각은 이렇습니다.

WPF는 다른 응답에서 언급된 Windows Forms의 화면 클래스에서 볼 수 있는 자세한 화면 정보를 노출하지 않는 것 같습니다.

그러나 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));

만약 당신이 트집을 잡는 사람이라면, 당신은 이 코드가 더블 투 인트 변환의 경우에 오른쪽과 아래 좌표를 1픽셀만큼 끌 수 있다는 것을 알아챘을 것입니다.하지만 당신은 트집을 잡는 사람이기 때문에, 제 코드를 고치는 것이 더 기쁠 것입니다 ;-)

그러기 위해서는 몇 가지 기본 방법을 사용해야 합니다.

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

C#에서 응용 프로그램이 실행 중인 화면을 어떻게 찾습니까?
또한 듀얼 스크린 환경에서 애플리케이션 실행에는 다음과 같은 흥미로운 솔루션이 있습니다.

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

여기서 "이것"이 응용프로그램의 기본 형식입니다.

다음 코드를 사용할 수 있습니다.

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})");
}

그러나 기본 모니터를 가져오는 더 짧은 방법이 있을 수 있습니다.

이 방법을 사용하여 다음과 같이 현재 양식의 현재 화면을 가져올 수 있습니다.

Screen screen = Screen.FromControl(this);

그런 다음 현재 화면이 기본 화면인지 확인할 수 있습니다.

언급URL : https://stackoverflow.com/questions/2465646/how-do-i-know-what-monitor-a-wpf-window-is-in