按增量移动鼠标会导致光标移动 "jittery"
Moving mouse by delta causes cursor movement to be "jittery"
我正在编写一个软件,它以双精度形式从 POT 获取模拟输入,范围从 -1 到 +1,然后尝试将其用作鼠标光标增量。一切正常,但 iteration/speed 太慢,迫使我乘以输入的值,导致光标移动不像我想要的那样流畅。
class myApp
{
double remX = 0;
double remY = 0;
double rateX = 0;
double rateY = 0;
private void mouseDeltaThread()
{
while (!Global.IsShuttingDown)
{
System.Threading.Thread.Sleep(1);
if (rateX != 0 || rateY !=0)
setMouseDelta(rateX,rateY);
}
}
private void setMouseDelta(double dX, double dY)
{
remX += (dX);
remY += (dY);
int moveX = (int)Math.Truncate(remX);
int moveY = (int)Math.Truncate(remY);
remX -= moveX;
remY -= moveY;
Shared.MoveCursorBy(moveX, moveY);
}
}
internal static class Shared
{
internal const uint INPUT_MOUSE = 0, INPUT_KEYBOARD = 1, INPUT_HARDWARE = 2;
private static INPUT[] sendInputs = new INPUT[2]; // will allow for keyboard + mouse/tablet input within one SendInput call, or two mouse events
private static object lockob = new object();
public static void MoveCursorBy(int x, int y)
{
lock (lockob)
{
if (x != 0 || y != 0)
{
sendInputs[0].type = INPUT_MOUSE;
sendInputs[0].data.mi.dwExtraInfo = IntPtr.Zero;
sendInputs[0].data.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_MOVE;
sendInputs[0].data.mi.mouseData = 0;
sendInputs[0].data.mi.time = 0;
sendInputs[0].data.mi.dx = x;
sendInputs[0].data.mi.dy = y;
uint result = SendInput(1, sendInputs, Marshal.SizeOf(sendInputs[0]));
}
}
}
}
我正在使用 SendInput
,因为它允许相对光标移动,但我想知道 SetCursorPos
并跟踪相对于屏幕的 x、y 是否更有效。
有更好的方法吗?
好多了,但在我的 waitHandle 上仍然花费了太多周期。我知道无限循环通常很糟糕,但我根本看不出有任何其他方法可以从中获得不错的性能,因为计时器似乎迭代得更慢。
class MyApp
{
double remX = 0;
double remY = 0;
double rateX = 0;
double rateY = 0;
private void mouseDeltaThread()
{
EventWaitHandle MyEventWaitHandle = new EventWaitHandle(false,EventResetMode.AutoReset);
while (!Global.IsShuttingDown)
{
MyEventWaitHandle.WaitOne(1);
if (rateX != 0 || rateY !=0)
setMouseDelta(rateX,rateY);
}
}
private void setMouseDelta(double dX, double dY)
{
remX += (dX);
remY += (dY);
int moveX = (int)remX;
int moveY = (int)remY;
remX -= moveX;
remY -= moveY;
Shared.MoveCursorBy(moveX, moveY);
}
}
internal static class Shared
{
public static void MoveCursorBy(int x, int y)
{
POINT p = new POINT();
GetCursorPos(out p);
p.x += x;
p.y += y;
SetCursorPos(p.x, p.y);
}
}
从上到下变化。
使用EventWaitHandle
。绝对喜欢这个并且会更频繁地使用它,但是与 Sleep(1) 没有明显的性能差异。
将 double
remX 和 remY 转换为 int
而不是 t运行cating 它。似乎有轻微的性能提升。
使用 GetCursorPos
和 SetCursorPos
代替 SendInput
。似乎表现更好,如果我保持自己的 运行ning x 和 y 坐标而不是每次迭代都调用 GetCursorPos
会更好,但我也想保持应用程序鼠标使用。
这仍然需要一些调整。正如我所说,我仍然在 EventWaitHandle
上花费了太多周期,而且我不知道如何让 运行 变得更好。
我正在编写一个软件,它以双精度形式从 POT 获取模拟输入,范围从 -1 到 +1,然后尝试将其用作鼠标光标增量。一切正常,但 iteration/speed 太慢,迫使我乘以输入的值,导致光标移动不像我想要的那样流畅。
class myApp
{
double remX = 0;
double remY = 0;
double rateX = 0;
double rateY = 0;
private void mouseDeltaThread()
{
while (!Global.IsShuttingDown)
{
System.Threading.Thread.Sleep(1);
if (rateX != 0 || rateY !=0)
setMouseDelta(rateX,rateY);
}
}
private void setMouseDelta(double dX, double dY)
{
remX += (dX);
remY += (dY);
int moveX = (int)Math.Truncate(remX);
int moveY = (int)Math.Truncate(remY);
remX -= moveX;
remY -= moveY;
Shared.MoveCursorBy(moveX, moveY);
}
}
internal static class Shared
{
internal const uint INPUT_MOUSE = 0, INPUT_KEYBOARD = 1, INPUT_HARDWARE = 2;
private static INPUT[] sendInputs = new INPUT[2]; // will allow for keyboard + mouse/tablet input within one SendInput call, or two mouse events
private static object lockob = new object();
public static void MoveCursorBy(int x, int y)
{
lock (lockob)
{
if (x != 0 || y != 0)
{
sendInputs[0].type = INPUT_MOUSE;
sendInputs[0].data.mi.dwExtraInfo = IntPtr.Zero;
sendInputs[0].data.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_MOVE;
sendInputs[0].data.mi.mouseData = 0;
sendInputs[0].data.mi.time = 0;
sendInputs[0].data.mi.dx = x;
sendInputs[0].data.mi.dy = y;
uint result = SendInput(1, sendInputs, Marshal.SizeOf(sendInputs[0]));
}
}
}
}
我正在使用 SendInput
,因为它允许相对光标移动,但我想知道 SetCursorPos
并跟踪相对于屏幕的 x、y 是否更有效。
有更好的方法吗?
好多了,但在我的 waitHandle 上仍然花费了太多周期。我知道无限循环通常很糟糕,但我根本看不出有任何其他方法可以从中获得不错的性能,因为计时器似乎迭代得更慢。
class MyApp
{
double remX = 0;
double remY = 0;
double rateX = 0;
double rateY = 0;
private void mouseDeltaThread()
{
EventWaitHandle MyEventWaitHandle = new EventWaitHandle(false,EventResetMode.AutoReset);
while (!Global.IsShuttingDown)
{
MyEventWaitHandle.WaitOne(1);
if (rateX != 0 || rateY !=0)
setMouseDelta(rateX,rateY);
}
}
private void setMouseDelta(double dX, double dY)
{
remX += (dX);
remY += (dY);
int moveX = (int)remX;
int moveY = (int)remY;
remX -= moveX;
remY -= moveY;
Shared.MoveCursorBy(moveX, moveY);
}
}
internal static class Shared
{
public static void MoveCursorBy(int x, int y)
{
POINT p = new POINT();
GetCursorPos(out p);
p.x += x;
p.y += y;
SetCursorPos(p.x, p.y);
}
}
从上到下变化。
使用EventWaitHandle
。绝对喜欢这个并且会更频繁地使用它,但是与 Sleep(1) 没有明显的性能差异。
将 double
remX 和 remY 转换为 int
而不是 t运行cating 它。似乎有轻微的性能提升。
使用 GetCursorPos
和 SetCursorPos
代替 SendInput
。似乎表现更好,如果我保持自己的 运行ning x 和 y 坐标而不是每次迭代都调用 GetCursorPos
会更好,但我也想保持应用程序鼠标使用。
这仍然需要一些调整。正如我所说,我仍然在 EventWaitHandle
上花费了太多周期,而且我不知道如何让 运行 变得更好。