WPF最大化避免覆盖任务栏
生活随笔
收集整理的這篇文章主要介紹了
WPF最大化避免覆盖任务栏
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文:WPF最大化避免覆蓋任務欄
WPF當窗體WindowStyle=”None”時,最大化會覆蓋掉任務欄。如何解決這個問題呢?
我在Google里面搜到一篇文章,要用到Win32 API,通過讓WPF窗體WM_GETMINMAXINFO消息掛接一個鉤子來處理。
?
?public static void RepairWindowBehavior(Window wpfWindow)
????{ ????????if (wpfWindow == null) ????????????return; ?? ????????wpfWindow.SourceInitialized += delegate ????????{ ????????????IntPtr handle = (new WindowInteropHelper(wpfWindow)).Handle; ????????????HwndSource source = HwndSource.FromHwnd(handle); ????????????if (source != null) ????????????{ ????????????????source.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) ????{ ????????MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO)); ?? ????????int MONITOR_DEFAULTTONEAREST = 0x00000002; ????????IntPtr monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); ?? ????????if (monitor != IntPtr.Zero) ????????{ ????????????MONITORINFO 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); ????} ?? ????[DllImport("user32")] ????internal static extern bool GetMonitorInfo(IntPtr hMonitor, MONITORINFO lpmi); ????[DllImport("User32")] ????internal static extern IntPtr MonitorFromWindow(IntPtr handle, int flags); ?? ????#region Nested type: MINMAXINFO ????[StructLayout(LayoutKind.Sequential)] ????internal struct MINMAXINFO ????{ ????????public POINT ptReserved; ????????public POINT ptMaxSize; ????????public POINT ptMaxPosition; ????????public POINT ptMinTrackSize; ????????public POINT ptMaxTrackSize; ????} ????#endregion ?? ????#region Nested type: MONITORINFO ????[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] ????internal class MONITORINFO ????{ ????????public int cbSize = Marshal.SizeOf(typeof(MONITORINFO)); ????????public RECT rcMonitor; ????????public RECT rcWork; ????????public int dwFlags; ????} ????#endregion ?? ????#region Nested type: POINT ????[StructLayout(LayoutKind.Sequential)] ????internal struct POINT ????{ ????????public int x; ????????public int y; ????????public POINT(int x, int y) ????????{ ????????????this.x = x; ????????????this.y = y; ????????} ????} ????#endregion ?? ????#region Nested type: RECT ????[StructLayout(LayoutKind.Sequential, Pack = 0)] ????internal struct RECT ????{ ????????public int left; ????????public int top; ????????public int right; ????????public int bottom; ?? ????????public static readonly RECT Empty; ?? ????????public int Width ????????{ ????????????get { return Math.Abs(right - left); } ????????} ????????public int Height ????????{ ????????????get { return bottom - top; } ????????} ?? ????????public RECT(int left, int top, int right, int bottom) ????????{ ????????????this.left = left; ????????????this.top = top; ????????????this.right = right; ????????????this.bottom = bottom; ????????} ?? ????????public RECT(RECT rcSrc) ????????{ ????????????left = rcSrc.left; ????????????top = rcSrc.top; ????????????right = rcSrc.right; ????????????bottom = rcSrc.bottom; ????????} ?? ????????public bool IsEmpty ????????{ ????????????get ????????????{ ????????????????return left >= right || top >= bottom; ????????????} ????????} ?? ????????public override string ToString() ????????{ ????????????if (this == Empty) ????????????{ ????????????????return "RECT {Empty}"; ????????????} ????????????return "RECT { left : " + left + " / top : " + top + " / right : " + right + " / bottom : " + bottom + " }"; ????????} ?? ????????public override bool Equals(object obj) ????????{ ????????????if (!(obj is Rect)) ????????????{ ????????????????return false; ????????????} ????????????return (this == (RECT)obj); ????????} ?? ????????public override int GetHashCode() ????????{ ????????????return left.GetHashCode() + top.GetHashCode() + right.GetHashCode() + bottom.GetHashCode(); ????????} ?? ????????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); ????????} ?? ????????public static bool operator !=(RECT rect1, RECT rect2) ????????{ ????????????return !(rect1 == rect2); ????????} ????} ????#endregion }通過調用WindowHelper.RepairWindowBehavior(Window)方法注冊Win32消息事件,以后調用this.WindowState = WindowState.Maximized;就可以解決最大化避免覆蓋任務欄的問題了。
總結
以上是生活随笔為你收集整理的WPF最大化避免覆盖任务栏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JSP完全自学手册图文教程
- 下一篇: 业界 | 复杂出行场景下,滴滴如何将AI