fix:issue #3
This commit is contained in:
@@ -23,6 +23,26 @@ namespace Ink_Canvas.Helpers
|
|||||||
[DllImport("user32.dll")]
|
[DllImport("user32.dll")]
|
||||||
private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
|
private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
|
||||||
|
|
||||||
|
[DllImport("shell32.dll")]
|
||||||
|
private static extern IntPtr SHAppBarMessage(uint dwMessage, ref APPBARDATA pData);
|
||||||
|
|
||||||
|
[DllImport("user32.dll")]
|
||||||
|
private static extern int SystemParametersInfo(uint uiAction, uint uiParam, IntPtr pvParam, uint fWinIni);
|
||||||
|
|
||||||
|
private const uint ABM_GETTASKBARPOS = 0x00000005;
|
||||||
|
private const int SPI_GETWORKAREA = 0x0030;
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
private struct APPBARDATA
|
||||||
|
{
|
||||||
|
public int cbSize;
|
||||||
|
public IntPtr hWnd;
|
||||||
|
public uint uCallbackMessage;
|
||||||
|
public uint uEdge;
|
||||||
|
public RECT rc;
|
||||||
|
public IntPtr lParam;
|
||||||
|
}
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
public struct RECT {
|
public struct RECT {
|
||||||
public int Left;
|
public int Left;
|
||||||
@@ -34,6 +54,60 @@ namespace Ink_Canvas.Helpers
|
|||||||
public int Height => Bottom - Top;
|
public int Height => Bottom - Top;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取Windows任务栏的高度(仅计算任务栏,不包括其他应用的停靠栏)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="screen">当前屏幕</param>
|
||||||
|
/// <param name="dpiScaleY">DPI缩放Y值</param>
|
||||||
|
/// <returns>任务栏高度</returns>
|
||||||
|
public static double GetTaskbarHeight(System.Windows.Forms.Screen screen, double dpiScaleY)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 创建APPBARDATA结构
|
||||||
|
var abd = new APPBARDATA();
|
||||||
|
abd.cbSize = Marshal.SizeOf(abd);
|
||||||
|
|
||||||
|
// 获取任务栏信息
|
||||||
|
IntPtr result = SHAppBarMessage(ABM_GETTASKBARPOS, ref abd);
|
||||||
|
if (result != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
// 获取当前屏幕的工作区
|
||||||
|
RECT workArea = new RECT();
|
||||||
|
SystemParametersInfo(SPI_GETWORKAREA, 0, Marshal.AllocHGlobal(Marshal.SizeOf(workArea)), 0);
|
||||||
|
|
||||||
|
// 根据任务栏位置计算高度
|
||||||
|
int taskbarHeight = 0;
|
||||||
|
|
||||||
|
// 任务栏的uEdge: 0=左, 1=上, 2=右, 3=下
|
||||||
|
switch (abd.uEdge)
|
||||||
|
{
|
||||||
|
case 1: // 上
|
||||||
|
taskbarHeight = abd.rc.Height;
|
||||||
|
break;
|
||||||
|
case 3: // 下
|
||||||
|
taskbarHeight = abd.rc.Height;
|
||||||
|
break;
|
||||||
|
case 0: // 左
|
||||||
|
case 2: // 右
|
||||||
|
// 水平任务栏不影响高度
|
||||||
|
taskbarHeight = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 考虑DPI缩放
|
||||||
|
return taskbarHeight / dpiScaleY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Debug.WriteLine($"获取任务栏高度出错: {ex.Message}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果获取失败,回退到通用方法
|
||||||
|
return (screen.Bounds.Height - screen.WorkingArea.Height) / dpiScaleY;
|
||||||
|
}
|
||||||
|
|
||||||
public static string WindowTitle() {
|
public static string WindowTitle() {
|
||||||
IntPtr foregroundWindowHandle = GetForegroundWindow();
|
IntPtr foregroundWindowHandle = GetForegroundWindow();
|
||||||
|
|
||||||
|
|||||||
@@ -1078,8 +1078,8 @@ namespace Ink_Canvas {
|
|||||||
var windowHandle = new WindowInteropHelper(this).Handle;
|
var windowHandle = new WindowInteropHelper(this).Handle;
|
||||||
var screen = System.Windows.Forms.Screen.FromHandle(windowHandle);
|
var screen = System.Windows.Forms.Screen.FromHandle(windowHandle);
|
||||||
double screenWidth = screen.Bounds.Width / dpiScaleX, screenHeight = screen.Bounds.Height / dpiScaleY;
|
double screenWidth = screen.Bounds.Width / dpiScaleX, screenHeight = screen.Bounds.Height / dpiScaleY;
|
||||||
var toolbarHeight = SystemParameters.PrimaryScreenHeight - SystemParameters.FullPrimaryScreenHeight -
|
// 仅计算Windows任务栏高度,不考虑其他程序对工作区的影响
|
||||||
SystemParameters.WindowCaptionHeight;
|
var toolbarHeight = ForegroundWindowInfo.GetTaskbarHeight(screen, dpiScaleY);
|
||||||
pos.X = (screenWidth - ViewboxFloatingBar.ActualWidth * ViewboxFloatingBarScaleTransform.ScaleX) / 2;
|
pos.X = (screenWidth - ViewboxFloatingBar.ActualWidth * ViewboxFloatingBarScaleTransform.ScaleX) / 2;
|
||||||
|
|
||||||
if (PosXCaculatedWithTaskbarHeight == false)
|
if (PosXCaculatedWithTaskbarHeight == false)
|
||||||
@@ -1141,8 +1141,8 @@ namespace Ink_Canvas {
|
|||||||
var windowHandle = new WindowInteropHelper(this).Handle;
|
var windowHandle = new WindowInteropHelper(this).Handle;
|
||||||
var screen = System.Windows.Forms.Screen.FromHandle(windowHandle);
|
var screen = System.Windows.Forms.Screen.FromHandle(windowHandle);
|
||||||
double screenWidth = screen.Bounds.Width / dpiScaleX, screenHeight = screen.Bounds.Height / dpiScaleY;
|
double screenWidth = screen.Bounds.Width / dpiScaleX, screenHeight = screen.Bounds.Height / dpiScaleY;
|
||||||
var toolbarHeight = SystemParameters.PrimaryScreenHeight - SystemParameters.FullPrimaryScreenHeight -
|
// 仅计算Windows任务栏高度,不考虑其他程序对工作区的影响
|
||||||
SystemParameters.WindowCaptionHeight;
|
var toolbarHeight = ForegroundWindowInfo.GetTaskbarHeight(screen, dpiScaleY);
|
||||||
pos.X = (screenWidth - ViewboxFloatingBar.ActualWidth * ViewboxFloatingBarScaleTransform.ScaleX) / 2;
|
pos.X = (screenWidth - ViewboxFloatingBar.ActualWidth * ViewboxFloatingBarScaleTransform.ScaleX) / 2;
|
||||||
|
|
||||||
pos.Y = screenHeight - ViewboxFloatingBar.ActualHeight * ViewboxFloatingBarScaleTransform.ScaleY -
|
pos.Y = screenHeight - ViewboxFloatingBar.ActualHeight * ViewboxFloatingBarScaleTransform.ScaleY -
|
||||||
@@ -1184,8 +1184,8 @@ namespace Ink_Canvas {
|
|||||||
var windowHandle = new WindowInteropHelper(this).Handle;
|
var windowHandle = new WindowInteropHelper(this).Handle;
|
||||||
var screen = System.Windows.Forms.Screen.FromHandle(windowHandle);
|
var screen = System.Windows.Forms.Screen.FromHandle(windowHandle);
|
||||||
double screenWidth = screen.Bounds.Width / dpiScaleX, screenHeight = screen.Bounds.Height / dpiScaleY;
|
double screenWidth = screen.Bounds.Width / dpiScaleX, screenHeight = screen.Bounds.Height / dpiScaleY;
|
||||||
var toolbarHeight = SystemParameters.PrimaryScreenHeight - SystemParameters.FullPrimaryScreenHeight -
|
// 仅计算Windows任务栏高度,不考虑其他程序对工作区的影响
|
||||||
SystemParameters.WindowCaptionHeight;
|
var toolbarHeight = ForegroundWindowInfo.GetTaskbarHeight(screen, dpiScaleY);
|
||||||
pos.X = (screenWidth - ViewboxFloatingBar.ActualWidth * ViewboxFloatingBarScaleTransform.ScaleX) / 2;
|
pos.X = (screenWidth - ViewboxFloatingBar.ActualWidth * ViewboxFloatingBarScaleTransform.ScaleX) / 2;
|
||||||
|
|
||||||
pos.Y = screenHeight - 55 * ViewboxFloatingBarScaleTransform.ScaleY;
|
pos.Y = screenHeight - 55 * ViewboxFloatingBarScaleTransform.ScaleY;
|
||||||
|
|||||||
Reference in New Issue
Block a user