Delphi 将鼠标环绕在屏幕边缘

Delphi 将鼠标环绕在屏幕边缘,delphi,mouse,cursor-position,Delphi,Mouse,Cursor Position,问题描述 我有一个Delphi组件。要设置值,可以单击并拖动 然而,当你到达屏幕边缘时,你不能再往前走了。然后,您需要返回组件并进一步拖动,这对用户来说不是很友好 首选解决方案 我想让鼠标光标环绕屏幕,如果你到达一个边缘,那么你可以继续滚动一个值。3dsmax广泛使用这种类型的GUI控件,我喜欢它的工作方式 或者,如果光标离开屏幕,但继续发送超出屏幕边界的X/Y坐标,对我来说也可以 到目前为止我拥有的 我知道我可以通过mouse.CursorPos获取/设置当前鼠标位置,并且可以通过screen

问题描述

我有一个Delphi组件。要设置值,可以单击并拖动

然而,当你到达屏幕边缘时,你不能再往前走了。然后,您需要返回组件并进一步拖动,这对用户来说不是很友好

首选解决方案

我想让鼠标光标环绕屏幕,如果你到达一个边缘,那么你可以继续滚动一个值。3dsmax广泛使用这种类型的GUI控件,我喜欢它的工作方式

或者,如果光标离开屏幕,但继续发送超出屏幕边界的X/Y坐标,对我来说也可以

到目前为止我拥有的

我知道我可以通过mouse.CursorPos获取/设置当前鼠标位置,并且可以通过screen.Width和screen.Height获取屏幕尺寸

下面的代码确实按照我想要的方式包装了鼠标器

procedure TFormXXXX.YYYYMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  LX, LY: Integer;
begin
  LX := Mouse.CursorPos.X;
  if LX < 1 then
    LX := Screen.Width - 1
  else
    if LX>Screen.Width -2 then
      LX := 0;

  LY := Mouse.CursorPos.Y;
  if LY < 1 then
    LY := Screen.Height - 1
  else
    if LY>Screen.Height -2 then
      LY := 0;

  Mouse.CursorPos := Point(LX, LY);
end;
过程tformxxx.YYYYMouseMove(发送方:TObject;Shift:TShiftState;X,Y:Integer);
变量
LX,LY:整数;
开始
LX:=Mouse.CursorPos.X;
如果LX<1,则
LX:=屏幕宽度-1
其他的
如果LX>Screen.Width-2,则
LX:=0;
LY:=Mouse.CursorPos.Y;
如果LY<1,则
LY:=屏幕高度-1
其他的
如果LY>Screen.Height-2,则
LY:=0;
Mouse.CursorPos:=点(LX,LY);
结束;
仍然存在一个问题,我必须“手动”跟踪包裹,以从起点获得适当的偏移,但我会找到解决方法

我只是不知道这样做是否合适。也许有人对此有一些经验或明智的说法

主要问题 是否有一种经过验证的通用方法? windows是否提供了这样的功能

我有一些疑问

  • 当有多个监视器时,这将如何表现
  • 如果用户通过慢速(VNC?)连接,会发生什么情况。。光标位置是否始终达到0或屏幕的另一端
  • 如果输入控件不是鼠标,而是画板或触摸屏,会发生什么
  • 改变鼠标位置是一种不好的做法吗?我可以想象,用户不喜欢我的应用程序弄乱他们的鼠标光标位置

与简单的线性刻度不同,您可以通过增加与控件的距离来加速更改,并在超过该距离时自动开始递增。基本上,它的工作原理与拖动选择文本类似,当鼠标到达窗口底部时,窗口开始滚动,即使鼠标到达该点后停止移动。

另一个您忘记的疑问是,在多个监视器存在的情况下,代码会如何运行,这不仅会导致鼠标在负坐标上有一个有效的位置,而且会导致非矩形桌面形状。你考虑过不同的拖动方式吗?让相对位置来控制控件,而不是绝对移动来确定控件的值。只要鼠标位于控件上方,就不断增加该值。控件上方的距离控制增加速率。这类似于在滚动文本框中选择文本。将插入符号拖到窗口顶部之外,窗口向上滚动,当前选择如下。感谢您帮助我在这个问题上跳出框框思考。控件可以按对数步长设置其值,但我要做的是在达到某个限制时使值增加或减少。这听起来比将鼠标位置缠绕在屏幕边缘更干净。