wpf中无边框窗体的问题

来源:互联网 发布:计算机专业学什么 知乎 编辑:程序博客网 时间:2024/05/22 15:24

无边框窗体最大化显示超出屏幕外的解决方案

相关:
https://stackoverflow.com/questions/12884987/wpf-borderless-window-on-maximize-exceeds-window-height-and-width?rq=1
Solved:
通过修改ResizeMode = ResizeMode.NoResize可以有效的解决该问题,但需要注意的是在其它窗口状态下ResizeMode需要恢复原先值。具体代码如下:

    private ResizeMode _preResizeMode;    private void BtnMax_OnClick(object sender, RoutedEventArgs e)    {        _preResizeMode = this.ResizeMode;        this.ResizeMode = ResizeMode.NoResize;        this.WindowState = WindowState.Maximized;    }    private void BtnNormax_OnClick(object sender, RoutedEventArgs e)    {        this.ResizeMode = _preResizeMode;        this.WindowState = WindowState.Normal;    }    private void BtnMinimal_OnClick(object sender, RoutedEventArgs e)    {        this.ResizeMode = _preResizeMode;        this.WindowState = WindowState.Minimized;    }

无边框窗体不摭挡桌面工具栏的代码

使用P/Invoke的方式

using System;using System.Collections.Generic;using System.Linq;using System.Runtime.InteropServices;using System.Text;using System.Windows;using System.Windows.Interop;namespace testxx22{    public partial class MainWindow    {        void MainWindow_SourceInitialized(object sender, EventArgs e)        {            IntPtr handle = (new WindowInteropHelper(this)).Handle;            HwndSource.FromHwnd(handle).AddHook(WindowProc);        }        private static IntPtr WindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)        {            switch (msg)            {                case 0x0024:                    WmGetMinMaxInfo(hwnd, lParam);                    handled = true;                    break;            }            return (IntPtr)0;        }        private static void WmGetMinMaxInfo(IntPtr hwnd, IntPtr lParam)        {            var mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO));            // Adjust the maximized size and position to fit the work area of the correct monitor            int MONITOR_DEFAULTTONEAREST = 0x00000002;            IntPtr monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);            if (monitor != IntPtr.Zero)            {                var monitorInfo = new MONITORINFO();                GetMonitorInfo(monitor, monitorInfo);                RECT rcWorkArea = monitorInfo.rcWork;                RECT rcMonitorArea = monitorInfo.rcMonitor;                mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.left - rcMonitorArea.left);                mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.top - rcMonitorArea.top);                //下两行是用来控制不摭挡工具栏                    mmi.ptMaxSize.x = Math.Abs(rcWorkArea.right - rcWorkArea.left);                mmi.ptMaxSize.y = Math.Abs(rcWorkArea.bottom - rcWorkArea.top);            }            Marshal.StructureToPtr(mmi, lParam, true);        }        /// <summary>        /// POINT aka POINTAPI        /// </summary>        [StructLayout(LayoutKind.Sequential)]        public struct POINT        {            /// <summary>            /// x coordinate of point.            /// </summary>            public int x;            /// <summary>            /// y coordinate of point.            /// </summary>            public int y;            /// <summary>            /// Construct a point of coordinates (x,y).            /// </summary>            public POINT(int x, int y)            {                this.x = x;                this.y = y;            }        }        [StructLayout(LayoutKind.Sequential)]        public struct MINMAXINFO        {            public POINT ptReserved;            public POINT ptMaxSize;            public POINT ptMaxPosition;            public POINT ptMinTrackSize;            public POINT ptMaxTrackSize;        };        /// <summary>        /// </summary>        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]        public class MONITORINFO        {            /// <summary>            /// </summary>            public int cbSize = Marshal.SizeOf(typeof(MONITORINFO));            /// <summary>            /// </summary>            public RECT rcMonitor = new RECT();            /// <summary>            /// </summary>            public RECT rcWork = new RECT();            /// <summary>            /// </summary>            public int dwFlags = 0;        }        /// <summary> Win32 </summary>        [StructLayout(LayoutKind.Sequential, Pack = 0)]        public struct RECT        {            /// <summary> Win32 </summary>            public int left;            /// <summary> Win32 </summary>            public int top;            /// <summary> Win32 </summary>            public int right;            /// <summary> Win32 </summary>            public int bottom;            /// <summary> Win32 </summary>            public static readonly RECT Empty = new RECT();            /// <summary> Win32 </summary>            public int Width            {                get { return Math.Abs(right - left); }  // Abs needed for BIDI OS            }            /// <summary> Win32 </summary>            public int Height            {                get { return bottom - top; }            }            /// <summary> Win32 </summary>            public RECT(int left, int top, int right, int bottom)            {                this.left = left;                this.top = top;                this.right = right;                this.bottom = bottom;            }            /// <summary> Win32 </summary>            public RECT(RECT rcSrc)            {                this.left = rcSrc.left;                this.top = rcSrc.top;                this.right = rcSrc.right;                this.bottom = rcSrc.bottom;            }            /// <summary> Win32 </summary>            public bool IsEmpty            {                get                {                    // BUGBUG : On Bidi OS (hebrew arabic) left > right                    return left >= right || top >= bottom;                }            }            /// <summary> Return a user friendly representation of this struct </summary>            public override string ToString()            {                if (this == RECT.Empty) { return "RECT {Empty}"; }                return "RECT { left : " + left + " / top : " + top + " / right : " + right + " / bottom : " + bottom + " }";            }            /// <summary> Determine if 2 RECT are equal (deep compare) </summary>            public override bool Equals(object obj)            {                if (!(obj is Rect)) { return false; }                return (this == (RECT)obj);            }            /// <summary>Return the HashCode for this struct (not garanteed to be unique)</summary>            public override int GetHashCode()            {                return left.GetHashCode() + top.GetHashCode() + right.GetHashCode() + bottom.GetHashCode();            }            /// <summary> Determine if 2 RECT are equal (deep compare)</summary>            public static bool operator ==(RECT rect1, RECT rect2)            {                return (rect1.left == rect2.left && rect1.top == rect2.top && rect1.right == rect2.right && rect1.bottom == rect2.bottom);            }            /// <summary> Determine if 2 RECT are different(deep compare)</summary>            public static bool operator !=(RECT rect1, RECT rect2)            {                return !(rect1 == rect2);            }        }        [DllImport("user32")]        internal static extern bool GetMonitorInfo(IntPtr hMonitor, MONITORINFO lpmi);        [DllImport("User32")]        internal static extern IntPtr MonitorFromWindow(IntPtr handle, int flags);    }}

较上一种的精简,不使用P/Invoke,但需要引用System.Windows.Form和System.Drawing

private void win_SourceInitialized(object sender, System.EventArgs e)        {            var handle = (new WindowInteropHelper(this)).Handle;            var handleSource = HwndSource.FromHwnd(handle);            if (handleSource == null)                return;            handleSource.AddHook(WindowProc);        }        private static IntPtr WindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)        {            switch (msg)            {                case 0x0024: /* WM_GETMINMAXINFO */                    WmGetMinMaxInfo(hwnd, lParam);                    handled = true;                    break;            }            return (IntPtr) 0;        }        private static void WmGetMinMaxInfo(IntPtr hwnd, IntPtr lParam)        {            var mmi = (MINMAXINFO) Marshal.PtrToStructure(lParam, typeof (MINMAXINFO));            // Adjust the maximized size and position to fit the work area of the correct monitor            var currentScreen = System.Windows.Forms.Screen.FromHandle(hwnd);            var workArea = currentScreen.WorkingArea;            var monitorArea = currentScreen.Bounds;            mmi.ptMaxPosition.x = Math.Abs(workArea.Left - monitorArea.Left);            mmi.ptMaxPosition.y = Math.Abs(workArea.Top - monitorArea.Top);            mmi.ptMaxSize.x = Math.Abs(workArea.Right - workArea.Left);            mmi.ptMaxSize.y = Math.Abs(workArea.Bottom - workArea.Top);            Marshal.StructureToPtr(mmi, lParam, true);        }    }    [StructLayout(LayoutKind.Sequential)]    public struct MINMAXINFO    {        public POINT ptReserved;        public POINT ptMaxSize;        public POINT ptMaxPosition;        public POINT ptMinTrackSize;        public POINT ptMaxTrackSize;    };    [StructLayout(LayoutKind.Sequential)]    public struct POINT    {        /// <summary>        /// x coordinate of point.        /// </summary>        public int x;        /// <summary>        /// y coordinate of point.        /// </summary>        public int y;        /// <summary>        /// Construct a point of coordinates (x,y).        /// </summary>        public POINT(int x, int y)        {            this.x = x;            this.y = y;        }    }
原创粉丝点击