From 95c307cc0b9feec209f239daf214b144b9dda027 Mon Sep 17 00:00:00 2001 From: PrefacedCorg <1876568293@qq.com> Date: Sun, 21 Dec 2025 16:32:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=BB=E5=8A=A1=E6=A0=8F?= =?UTF-8?q?=E9=AB=98=E5=BA=A6=E8=AE=A1=E7=AE=97=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 应该可以解决 dock 栏偏移的问题 可能会炸 炸了再说 --- Ink Canvas/Helpers/ForegroundWindowInfo.cs | 44 ++++++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/Ink Canvas/Helpers/ForegroundWindowInfo.cs b/Ink Canvas/Helpers/ForegroundWindowInfo.cs index 6926a610..8759468a 100644 --- a/Ink Canvas/Helpers/ForegroundWindowInfo.cs +++ b/Ink Canvas/Helpers/ForegroundWindowInfo.cs @@ -36,6 +36,24 @@ namespace Ink_Canvas.Helpers public int Height => Bottom - Top; } + [StructLayout(LayoutKind.Sequential)] + private struct MONITORINFO + { + public uint cbSize; + public RECT rcMonitor; + public RECT rcWork; + public uint dwFlags; + } + + [DllImport("user32.dll")] + private static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFO lpmi); + + [DllImport("user32.dll")] + private static extern IntPtr MonitorFromWindow(IntPtr hwnd, uint dwFlags); + + [DllImport("user32.dll")] + private static extern IntPtr MonitorFromRect(ref RECT lprc, uint dwFlags); + public static string WindowTitle() { IntPtr foregroundWindowHandle = GetForegroundWindow(); @@ -106,10 +124,28 @@ namespace Ink_Canvas.Helpers public static double GetTaskbarHeight(Screen screen, double dpiScaleY) { - // 获取工作区和屏幕高度的差值 - var workingArea = screen.WorkingArea; - var bounds = screen.Bounds; - int taskbarHeight = bounds.Height - workingArea.Height; + // 创建RECT结构体表示屏幕边界 + RECT screenRect = new RECT + { + Left = screen.Bounds.Left, + Top = screen.Bounds.Top, + Right = screen.Bounds.Right, + Bottom = screen.Bounds.Bottom + }; + + // 获取屏幕句柄 + const uint MONITOR_DEFAULTTONEAREST = 0x00000002; + IntPtr hMonitor = MonitorFromRect(ref screenRect, MONITOR_DEFAULTTONEAREST); + + // 初始化MONITORINFO结构体 + MONITORINFO monitorInfo = new MONITORINFO(); + monitorInfo.cbSize = (uint)Marshal.SizeOf(typeof(MONITORINFO)); + + // 获取监视器信息 + GetMonitorInfo(hMonitor, ref monitorInfo); + + // 计算任务栏高度:monitorInfo.rcMonitor.bottom减去monitorInfo.rcWork.bottom的值 + int taskbarHeight = monitorInfo.rcMonitor.Bottom - monitorInfo.rcWork.Bottom; // 考虑 DPI 缩放 return taskbarHeight / dpiScaleY; }