|
@@ -1,6 +1,11 @@
|
|
|
using GeekDesk.Constant;
|
|
|
using System;
|
|
|
+using System.Drawing;
|
|
|
+using System.Runtime.InteropServices;
|
|
|
using System.Windows;
|
|
|
+using System.Windows.Forms;
|
|
|
+using System.Windows.Input;
|
|
|
+using static GeekDesk.Util.ShowWindowFollowMouse;
|
|
|
|
|
|
namespace GeekDesk.Util
|
|
|
{
|
|
@@ -18,89 +23,248 @@ namespace GeekDesk.Util
|
|
|
RIGHT_CENTER = 7
|
|
|
}
|
|
|
|
|
|
+ public static void FollowMouse(Window window)
|
|
|
+ {
|
|
|
+ // Get the mouse position
|
|
|
+ var mousePosition = System.Windows.Forms.Control.MousePosition;
|
|
|
+
|
|
|
+ // Get the window size
|
|
|
+ var windowWidth = window.Width;
|
|
|
+ var windowHeight = window.Height;
|
|
|
+
|
|
|
+ Console.WriteLine("windowWidth + windowHeight:" + windowWidth + "+" + windowHeight);
|
|
|
+
|
|
|
+ // Get the screen where the mouse is located
|
|
|
+ var screen = System.Windows.Forms.Screen.FromPoint(new System.Drawing.Point(mousePosition.X, mousePosition.Y));
|
|
|
+ var workingArea = screen.WorkingArea;
|
|
|
+
|
|
|
+ // Get the DPI scaling factor for the screen
|
|
|
+ //float dpiX, dpiY;
|
|
|
+ //using (var graphics = System.Drawing.Graphics.FromHwnd(IntPtr.Zero))
|
|
|
+ //{
|
|
|
+ // dpiX = graphics.DpiX / 96f; // 96 is the default DPI
|
|
|
+ // dpiY = graphics.DpiY / 96f; // 96 is the default DPI
|
|
|
+ //}
|
|
|
+
|
|
|
+ float dpiX = GetDpi( true);
|
|
|
+ float dpiY = GetDpi(false);
|
|
|
+
|
|
|
+ // Convert mouse position to logical pixels based on DPI
|
|
|
+ double mouseX = mousePosition.X / dpiX;
|
|
|
+ double mouseY = mousePosition.Y / dpiY;
|
|
|
+
|
|
|
+ // Calculate target position to center the window on the mouse
|
|
|
+ double targetLeft = mouseX - windowWidth / 2;
|
|
|
+ double targetTop = mouseY - windowHeight / 2;
|
|
|
+
|
|
|
+ // Ensure the window does not exceed the screen boundaries
|
|
|
+ if (targetLeft < workingArea.Left / dpiX)
|
|
|
+ targetLeft = workingArea.Left / dpiX;
|
|
|
+ if (targetLeft + windowWidth / dpiX > workingArea.Right / dpiX)
|
|
|
+ targetLeft = workingArea.Right / dpiX - windowWidth / dpiX;
|
|
|
+
|
|
|
+ if (targetTop < workingArea.Top / dpiY)
|
|
|
+ targetTop = workingArea.Top / dpiY;
|
|
|
+ if (targetTop + windowHeight / dpiY > workingArea.Bottom / dpiY)
|
|
|
+ targetTop = workingArea.Bottom / dpiY - windowHeight / dpiY;
|
|
|
+
|
|
|
+ // Update window position
|
|
|
+ window.Left = targetLeft * dpiX;
|
|
|
+ window.Top = targetTop * dpiY;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static float GetDpi(bool isX)
|
|
|
+ {
|
|
|
+ IntPtr hdc = WindowUtil.GetDC(IntPtr.Zero);
|
|
|
+ int dpi = isX ? WindowUtil.GetDeviceCaps(hdc, LOGPIXELSX) : WindowUtil.GetDeviceCaps(hdc, LOGPIXELSY);
|
|
|
+ WindowUtil.ReleaseDC(IntPtr.Zero, hdc);
|
|
|
+ return dpi / 96f;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static IntPtr GetScreenHandleFromMouse()
|
|
|
+ {
|
|
|
+ // Get the mouse position
|
|
|
+ var mousePosition = System.Windows.Forms.Control.MousePosition;
|
|
|
+
|
|
|
+ // Convert mouse position to a POINT structure
|
|
|
+ System.Drawing.Point point = new System.Drawing.Point(mousePosition.X, mousePosition.Y);
|
|
|
+
|
|
|
+ // Get the window handle from the point
|
|
|
+ IntPtr windowHandle = WindowUtil.WindowFromPoint(point);
|
|
|
+
|
|
|
+ return windowHandle;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Constants for DPI
|
|
|
+ private const int HORZRES = 8;
|
|
|
+ private const int VERTRES = 10;
|
|
|
+ private const int LOGPIXELSX = 88;
|
|
|
+ private const int LOGPIXELSY = 90;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
/// <summary>
|
|
|
- /// 随鼠标位置显示面板
|
|
|
+ /// 随鼠标位置显示面板 后面三个参数暂时没有使用
|
|
|
/// </summary>
|
|
|
public static void Show(Window window, MousePosition position, double widthOffset = 0, double heightOffset = 0)
|
|
|
{
|
|
|
//获取鼠标位置
|
|
|
- System.Windows.Point p = MouseUtil.GetMousePosition();
|
|
|
- double left = SystemParameters.VirtualScreenLeft;
|
|
|
- double top = SystemParameters.VirtualScreenTop;
|
|
|
- double width = SystemParameters.VirtualScreenWidth;
|
|
|
- double height = SystemParameters.WorkArea.Height;
|
|
|
- double right = width - Math.Abs(left);
|
|
|
- double bottom = height - Math.Abs(top);
|
|
|
-
|
|
|
- double afterWidth;
|
|
|
- double afterHeight;
|
|
|
-
|
|
|
- switch (position)
|
|
|
- {
|
|
|
+ System.Drawing.Point p = System.Windows.Forms.Cursor.Position;
|
|
|
|
|
|
- case MousePosition.LEFT_BOTTOM:
|
|
|
- afterWidth = 0;
|
|
|
- afterHeight = window.Height;
|
|
|
- break;
|
|
|
- case MousePosition.LEFT_TOP:
|
|
|
- afterWidth = 0;
|
|
|
- afterHeight = 0;
|
|
|
- break;
|
|
|
- case MousePosition.LEFT_CENTER:
|
|
|
- afterWidth = 0;
|
|
|
- afterHeight = window.Height / 2;
|
|
|
- break;
|
|
|
- case MousePosition.RIGHT_BOTTOM:
|
|
|
- afterWidth = window.Width;
|
|
|
- afterHeight = window.Height;
|
|
|
- break;
|
|
|
- case MousePosition.RIGHT_TOP:
|
|
|
- afterWidth = window.Width;
|
|
|
- afterHeight = 0;
|
|
|
- break;
|
|
|
- case MousePosition.RIGHT_CENTER:
|
|
|
- afterWidth = window.Width;
|
|
|
- afterHeight = window.Height / 2;
|
|
|
- break;
|
|
|
- default:
|
|
|
- afterWidth = window.Width / 2;
|
|
|
- afterHeight = window.Height / 2;
|
|
|
- break;
|
|
|
- }
|
|
|
+ // 获取鼠标所在的屏幕
|
|
|
+ Screen currentScreen = Screen.FromPoint(p);
|
|
|
+ float dpiX = GetDpi(true);
|
|
|
+ float dpiY = GetDpi(false);
|
|
|
|
|
|
- afterWidth += widthOffset;
|
|
|
- afterHeight -= heightOffset;
|
|
|
+ p.X = (int)(p.X / dpiX);
|
|
|
+ p.Y = (int)(p.Y / dpiY);
|
|
|
|
|
|
- if (p.X - afterWidth < left)
|
|
|
+ //工作区宽度
|
|
|
+ double screenWidth = currentScreen.WorkingArea.Width / dpiX;
|
|
|
+ //工作区高度
|
|
|
+ double screenHeight = currentScreen.WorkingArea.Height / dpiY;
|
|
|
+ double screenX = currentScreen.WorkingArea.X / dpiX;
|
|
|
+ double screenY = currentScreen.WorkingArea.Y / dpiY;
|
|
|
+
|
|
|
+ //判断是否超出最左边缘
|
|
|
+ if (p.X - window.Width / 2 < screenX)
|
|
|
{
|
|
|
- //判断是否在最左边缘
|
|
|
- window.Left = left - Constants.SHADOW_WIDTH;
|
|
|
- }
|
|
|
- else if (p.X + afterWidth > right)
|
|
|
+ //超出最左边缘
|
|
|
+ window.Left = screenX - Constants.SHADOW_WIDTH;
|
|
|
+ } else
|
|
|
{
|
|
|
- //判断是否在最右边缘
|
|
|
- window.Left = right - window.Width + Constants.SHADOW_WIDTH;
|
|
|
+ window.Left = p.X - window.Width / 2 + Constants.SHADOW_WIDTH;
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ //判断是否超出最右边缘
|
|
|
+ if (p.X + window.Width / 2 > screenWidth + screenX)
|
|
|
{
|
|
|
- window.Left = p.X - afterWidth;
|
|
|
+ //超出最右边缘
|
|
|
+ window.Left = screenWidth + screenX - window.Width + Constants.SHADOW_WIDTH;
|
|
|
}
|
|
|
+
|
|
|
|
|
|
-
|
|
|
- if (p.Y - afterHeight < top)
|
|
|
+ //判断是否超出最上边缘
|
|
|
+ if (p.Y - window.Height / 2 < screenY)
|
|
|
{
|
|
|
- //判断是否在最上边缘
|
|
|
- window.Top = top - Constants.SHADOW_WIDTH;
|
|
|
- }
|
|
|
- else if (p.Y + afterHeight > bottom)
|
|
|
+ //超出最上边缘
|
|
|
+ window.Top = screenY - Constants.SHADOW_WIDTH;
|
|
|
+ } else
|
|
|
{
|
|
|
- //判断是否在最下边缘
|
|
|
- window.Top = bottom - window.Height + Constants.SHADOW_WIDTH;
|
|
|
+ window.Top = p.Y - window.Height / 2 + Constants.SHADOW_WIDTH;
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ //判断是否超出最下边缘
|
|
|
+ if (p.Y + window.Height / 2 > screenHeight + screenY)
|
|
|
{
|
|
|
- window.Top = p.Y - afterHeight;
|
|
|
+ //超出最下边缘
|
|
|
+ window.Top = screenHeight + screenY - window.Height + Constants.SHADOW_WIDTH;
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ //// 显示屏幕信息
|
|
|
+ //Console.WriteLine("鼠标当前所在屏幕的信息:");
|
|
|
+ //Console.WriteLine($"屏幕设备名称: {currentScreen.DeviceName}");
|
|
|
+ //Console.WriteLine($"屏幕分辨率: {currentScreen.Bounds.Width}x{currentScreen.Bounds.Height}");
|
|
|
+ //Console.WriteLine($"屏幕工作区: {currentScreen.WorkingArea}");
|
|
|
+ //Console.WriteLine($"主屏幕: {currentScreen.Primary}");
|
|
|
+
|
|
|
+ //Console.WriteLine(p.X + "=" + p.Y);
|
|
|
+ //float dpiX = GetDpi(true);
|
|
|
+ //float dpiY = GetDpi(false);
|
|
|
+ //p.X = (int)(p.X / dpiX);
|
|
|
+ //p.Y = (int)(p.Y / dpiY);
|
|
|
+ //Console.WriteLine(p.X + "=" + p.Y);
|
|
|
+ //double left = SystemParameters.VirtualScreenLeft;
|
|
|
+ //double top = SystemParameters.VirtualScreenTop;
|
|
|
+ //double width = SystemParameters.VirtualScreenWidth;
|
|
|
+ //double height = SystemParameters.WorkArea.Bottom;
|
|
|
+
|
|
|
+ //Console.WriteLine("VirtualScreenTop:" + SystemParameters.VirtualScreenTop);
|
|
|
+ //Console.WriteLine("VirtualScreenLeft:" + SystemParameters.VirtualScreenLeft);
|
|
|
+ //Console.WriteLine("VirtualScreenWidth:" + SystemParameters.VirtualScreenWidth);
|
|
|
+ //Console.WriteLine("VirtualScreenHeight:" + SystemParameters.VirtualScreenHeight);
|
|
|
+ //Console.WriteLine("WorkArea.Bottom:" + SystemParameters.WorkArea.Bottom);
|
|
|
+ //Console.WriteLine(" window.Height:" + window.Height);
|
|
|
+ //double right = width - Math.Abs(left);
|
|
|
+ //double bottom = height - Math.Abs(top);
|
|
|
+
|
|
|
+ //double afterWidth;
|
|
|
+ //double afterHeight;
|
|
|
+
|
|
|
+ //switch (position)
|
|
|
+ //{
|
|
|
+
|
|
|
+ // case MousePosition.LEFT_BOTTOM:
|
|
|
+ // afterWidth = 0;
|
|
|
+ // afterHeight = window.Height;
|
|
|
+ // break;
|
|
|
+ // case MousePosition.LEFT_TOP:
|
|
|
+ // afterWidth = 0;
|
|
|
+ // afterHeight = 0;
|
|
|
+ // break;
|
|
|
+ // case MousePosition.LEFT_CENTER:
|
|
|
+ // afterWidth = 0;
|
|
|
+ // afterHeight = window.Height / 2;
|
|
|
+ // break;
|
|
|
+ // case MousePosition.RIGHT_BOTTOM:
|
|
|
+ // afterWidth = window.Width;
|
|
|
+ // afterHeight = window.Height;
|
|
|
+ // break;
|
|
|
+ // case MousePosition.RIGHT_TOP:
|
|
|
+ // afterWidth = window.Width;
|
|
|
+ // afterHeight = 0;
|
|
|
+ // break;
|
|
|
+ // case MousePosition.RIGHT_CENTER:
|
|
|
+ // afterWidth = window.Width;
|
|
|
+ // afterHeight = window.Height / 2;
|
|
|
+ // break;
|
|
|
+ // default:
|
|
|
+ // afterWidth = window.Width / 2;
|
|
|
+ // afterHeight = window.Height / 2;
|
|
|
+ // break;
|
|
|
+ //}
|
|
|
+
|
|
|
+ //afterWidth += widthOffset;
|
|
|
+ //afterHeight -= heightOffset;
|
|
|
+
|
|
|
+ //if (p.X - afterWidth < left)
|
|
|
+ //{
|
|
|
+ // //判断是否在最左边缘
|
|
|
+ // window.Left = left - Constants.SHADOW_WIDTH;
|
|
|
+ //}
|
|
|
+ //else if (p.X + afterWidth > right)
|
|
|
+ //{
|
|
|
+ // //判断是否在最右边缘
|
|
|
+ // window.Left = right - window.Width + Constants.SHADOW_WIDTH;
|
|
|
+ //}
|
|
|
+ //else
|
|
|
+ //{
|
|
|
+ // window.Left = p.X - afterWidth;
|
|
|
+ //}
|
|
|
+
|
|
|
+
|
|
|
+ //if (p.Y - afterHeight < top)
|
|
|
+ //{
|
|
|
+ // //判断是否在最上边缘
|
|
|
+ // window.Top = top - Constants.SHADOW_WIDTH;
|
|
|
+ //}
|
|
|
+ //else if (p.Y + afterHeight > bottom)
|
|
|
+ //{
|
|
|
+ // Console.WriteLine("p.Y:" + p.Y);
|
|
|
+ // Console.WriteLine("afterHeight:" + afterHeight);
|
|
|
+ // Console.WriteLine("bottom:" + bottom);
|
|
|
+ // //判断是否在最下边缘
|
|
|
+ // window.Top = bottom - window.Height + Constants.SHADOW_WIDTH;
|
|
|
+ //}
|
|
|
+ //else
|
|
|
+ //{
|
|
|
+ // window.Top = p.Y - afterHeight;
|
|
|
+ //}
|
|
|
}
|
|
|
|
|
|
}
|