我有一个WPF窗口,该窗口可在具有不同分辨率的多个监视器上运行。当我将窗口从高分辨率监视器移动到低分辨率监视器时,反而会变好,但是不必足够聪明地更改最大高度。
当前要求非常简单,可以根据当前监视器的高度设置模态窗口的最大高度。
我已经测试了
Screen.PrimaryScreen.WorkingArea.Height
Screen.PrimaryScreen.WorkingArea.Width
但是它只给出了我需要窗口当前所在屏幕高度的系统主屏幕的高度。
在多台监视器中,另一个主要问题是windows的顶级属性,在高分辨率监视器中,它很好,但在低分辨率或辅助监视器中,它从不同的数字开始,例如160。
答案 0 :(得分:0)
您可以使用Win32 API MonitorFromWindow
或Forms API Screen.FromHandle
来确定窗口当前所在的监视器区域。
在下面的两个示例中,我将最大高度设置为窗口当前所在的监视器/屏幕的工作区域高度的50%。以下两个示例位于System.Windows.Window
子类的方法中(因此 this 引用了Window
)。
full example source code is here。
var window = new System.Windows.Interop.WindowInteropHelper(this);
IntPtr hWnd = window.Handle;
var screen = System.Windows.Forms.Screen.FromHandle(hWnd);
MaxHeight = 0.5 * screen.WorkingArea.Height;
var window = new System.Windows.Interop.WindowInteropHelper(this);
IntPtr hWnd = window.Handle;
IntPtr hMonitor = Win32.MonitorFromWindow(hWnd, Win32.MONITOR_DEFAULTTONEAREST);
var monitorInfo = new Win32.MONITORINFOEX();
monitorInfo.cbSize = (int)Marshal.SizeOf(monitorInfo);
if (Win32.GetMonitorInfo(hMonitor, ref monitorInfo))
{
MaxHeight = (monitorInfo.rcWork.Bottom - monitorInfo.rcWork.Top) * 0.5;
}
请注意,Win32.MonitorFromWindow
是Win32的MonitorFromWindow
函数的重要组成部分。
答案 1 :(得分:0)
我认为测试程序中的帮助程序类将为DPI感知程序和非DPI感知程序提供您所需的值:Screen Parameters。
这使用几个Win32 API调用来获取各种屏幕参数。它还提供了屏幕比例因子,可让您根据当前放置窗口的屏幕来调整窗口大小。