日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

WPF最大化避免覆盖任务栏

發布時間:2025/4/5 asp.net 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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最大化避免覆盖任务栏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。