wpf 全屏防止任务栏被屏蔽

2023年11月22日 534点热度 0人点赞 0条评论
内容纲要

先引入 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 事件,获取屏幕去掉任务栏的高度或宽度,因为有些人的任务栏可能会在左右两边,所以高度和宽度都要额外计算。

第三步,电脑可能会有多个屏幕,需要注意两点。

  • 用户拖动窗口时,不允许窗口被拖动丢到边缘,不然窗口会消失到屏幕之外,或者太小了,没法将窗口从屏幕边缘拖出来。
    file
  • 第二点是,由于可能有多个屏幕,每个屏幕的大小不一样,拖动窗口后需要计算。
            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;
                }
            };

痴者工良

高级程序员劝退师

文章评论