私は、-1から+1までの範囲の倍精度の形でPOTからアナログ入力を受け取り、これをマウスカーソルデルタとして使用します。すべてが機能しますが、反復/速度が遅すぎるため、入力の値を掛けてカーソルを移動させ、私が望むほど流動的でないようにしなければなりません。デルタでマウスを動かすと、カーソルの動きが「びびり」になる
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]));
}
}
}
}
それは相対的カーソル移動を可能にするが、私はSetCursorPos
かしらとXを追跡するため、画面にYに対しては、より効率的であるSendInput
を使用しています。
これを行うには良い方法がありますか?
ピクセル移動の小数部分を正しく保持するように設定されているようです。私が推測できる唯一のことは、あなたが望む結果を得るためにPOTが必要な忠実度を欠いていることです。おそらく、POT出力の「曲線」をテストして、どれほど滑らかであるかを調べることは興味深いでしょう。 – LodeRunner28
私はそれを固定値にしてみてみましたが、まだジッタがあります。 Iveは、実行頻度の差を計算するためにストップウォッチを設定し、それを真のデルタVに変えることを考慮しました。しかし、私は既に、1回の反復で5ピクセルも移動させて、私はループにコードを追加することに懸念しています。私はこの時点で私の質問は学問的だと思うし、 'SendInput'がこれを行う最も効果的な方法であるのだろうかと思っています。 – Wobbles