将鼠标缠绕在屏幕边缘

时间:2010-11-03 19:01:25

标签: delphi mouse cursor-position

问题描述

我有一个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;

还有一个问题是我必须“手动”跟踪换行以获得起点的正确偏移,但我会找到解决这个问题的方法。

我只是不知道这是否是一种正确的方法。也许有人有一些经验或明智的话来说明这个......

主要问题

对此有一种久经考验的常用方法吗? Windows可以提供这样的东西吗?

有些怀疑我

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

1 个答案:

答案 0 :(得分:4)

不是使用简单的线性刻度,而是可以通过增加与控件的距离来加速变化,并且在过去的位置开始自动递增。基本上它可以像拖动选择文本一样工作,一旦鼠标到达窗口底部,窗口就会开始滚动,即使鼠标到达那个点时停止移动。