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
'source' 카테고리의 다른 글
WPF 탭 컨트롤에서 탭 헤더 숨기기 (0) | 2023.05.10 |
---|---|
명령줄에서 Node.js 버전을 선택하시겠습니까?(REPL이 아님) (0) | 2023.05.10 |
파이썬 3에서 int()와 floor()의 차이점은 무엇입니까? (0) | 2023.05.05 |
내부 vs.개인 액세스 수정자 (0) | 2023.05.05 |
내 파일을 무시하는 gitignore 규칙 설명 (0) | 2023.05.05 |