内容目录
先引入 PInvoke.net 或 Microsoft.Windows.CsWin32,请参考:
https://www.whuanle.cn/archives/21436
定义两个获取屏幕去掉任务栏的长宽高函数:
public static int GetSystemMetrics_SM_CYMAXIMIZED()
{
return PInvoke.GetSystemMetrics(Windows.Win32.UI.WindowsAndMessaging.SYSTEM_METRICS_INDEX.SM_CYMAXIMIZED);
}
public static int GetSystemMetrics_SM_CXFULLSCREENY()
{
return PInvoke.GetSystemMetrics(Windows.Win32.UI.WindowsAndMessaging.SYSTEM_METRICS_INDEX.SM_CXMAXIMIZED);
}
然后编写代码,在窗口的构造函数的 InitializeComponent()
代码之后调用。
第一步,计算窗口启动时,窗口初始化大小。默认设置为屏幕的 0.7*0.8
。
第二步,设置 SizeChanged 事件,获取屏幕去掉任务栏的高度或宽度,因为有些人的任务栏可能会在左右两边,所以高度和宽度都要额外计算。
第三步,电脑可能会有多个屏幕,需要注意两点。
- 用户拖动窗口时,不允许窗口被拖动丢到边缘,不然窗口会消失到屏幕之外,或者太小了,没法将窗口从屏幕边缘拖出来。
- 第二点是,由于可能有多个屏幕,每个屏幕的大小不一样,拖动窗口后需要计算。
var nativeWindow = this;
// 工作区域大小
var PX = SystemParameters.FullPrimaryScreenWidth;
var PY = SystemParameters.FullPrimaryScreenHeight;
nativeWindow.Width = PX * 0.7;
nativeWindow.Height = PY * 0.8;
nativeWindow.MinHeight = 400;
nativeWindow.MinWidth = 500;
nativeWindow.MaxHeight = GetSystemMetrics_SM_CXFULLSCREENY();
nativeWindow.WindowStartupLocation = WindowStartupLocation.CenterScreen;
nativeWindow.SizeChanged += (sender, e) =>
{
if (nativeWindow.WindowState == WindowState.Maximized)
{
return;
}
};
nativeWindow.LocationChanged += (sender, e) =>
{
Window window = (Window)sender!;
// 当前屏幕范围
var x = GetSystemMetrics_SM_CYMAXIMIZED();
var y = GetSystemMetrics_SM_CXFULLSCREENY();
var (sizeHeight, sizeWidth) = (window.Height, window.Width);
var (positionX, positionY) = (window.Left, window.Top);
var _x = positionX;
var _y = positionY;
if (positionY < 0)
y = 0;
else if (y - positionY < 100)
_y = y - 100;
if (_x != positionX || _y != positionY)
{
window.Left = _x;
window.Top = _y;
}
};
文章评论