3

プログラムで2つの座標間でマウスを動かそうとしています。しかし、私はすべての高速または低速の処理マシンで速度を確実に維持したいと考えています。私はここでこのリンクを見ました。ただし、2つの座標間の移動をシミュレートするときに、カーソルの最適で滑らかで目に見える速度を保証するものではありません。さまざまなマシンの遅延やステップの最適値などのパラメーターを決定するためのトリックを誰かが知っているのだろうか私の最初のアイデアのように、特定の反復にforループを使用してマシンのパフォーマンスを決定し、 -ループは...アイデアを取りましたか?または私はこれについて完全に間違っていますか?ありがとう

4

3 に答える 3

4

モーションを時間の関数にする必要があります。C#での答えから始めて、マウスを現実的に動かし、Stopwatchクラスを使用して経過時間を測定します。

public void LinearSmoothMove(Point newPosition, TimeSpan duration) 
{
    Point start = GetCursorPosition();

    // Find the vector between start and newPosition
    double deltaX = newPosition.X - start.X;
    double deltaY = newPosition.Y - start.Y;

    // start a timer
    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();

    double timeFraction = 0.0;

    do
    {
        timeFraction = (double)stopwatch.Elapsed.Ticks / duration.Ticks;
        if (timeFraction > 1.0)
            timeFraction = 1.0;

        PointF curPoint = new PointF(start.X + timeFraction * deltaX, 
                                     start.Y + timeFraction * deltaY);
        SetCursorPosition(Point.Round(curPoint));
        Thread.Sleep(20);
    } while (timeFraction < 1.0);
}
于 2011-05-05T19:13:26.663 に答える
0

私はいくつかの物理学をお勧めします。速度は距離を時間で割ったものです。すべてのマシンで一定のマウス速度が必要な場合は、正確な時刻を取得する必要があります。

例を見てみましょう:

マウスをポイント0/0から400/600に移動すると、常に3秒後にエンドポイントに到達する必要があります。

したがって、開始時間を節約し、開始時間+3秒で終了するwhileループを作成する必要があります。ループでは、経過時間と合計時間からX座標とY座標を計算します。

X = 400 / 3s * ElapsedTime
Y = 600 / 3s * ElapsedTime

これはマシンに依存しません。良い結果を得るには、ストップウォッチのような高精度の時間を使用する必要があります。

于 2011-05-05T19:15:04.453 に答える
0

私はこれを試しましたが、それでも最適ではありません。それでも、マシンの処理能力によって異なります。@ Justin、継続時間とスリープ時間には異なる値を使用してください。テストした後、より良い解決策を思いついた場合はお知らせください。ありがとうございます。

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;

namespace ConsoleApplication11
{
   class Program
    {

       [DllImport("user32.dll")]
       static extern bool SetCursorPos(int X, int Y);   

       public static void LinearSmoothMove(Point newPosition, TimeSpan duration)
       {
           Point start = Cursor.Position;
           int sleep = 10;
           //PointF iterPoint = start;
           // Find the vector between start and newPosition   
           double deltaX = newPosition.X - start.X;
           double deltaY = newPosition.Y - start.Y;
           // start a timer    
           Stopwatch stopwatch = new Stopwatch();
           stopwatch.Start();
           double timeFraction = 0.0;
           do
           {
               timeFraction = (double)stopwatch.Elapsed.Ticks / duration.Ticks;
               if (timeFraction > 1.0)
                timeFraction = 1.0;
               PointF curPoint = new PointF((float)(start.X + timeFraction * deltaX), (float)(start.Y + timeFraction * deltaY));
               SetCursorPos(Point.Round(curPoint).X, Point.Round(curPoint).Y);
               Thread.Sleep(sleep);
           } while (timeFraction < 1.0);
       }
       static void Main(string[] args)
       {
             TimeSpan delayt = new  TimeSpan(0, 0, 3);
           LinearSmoothMove(new Point(20, 40), delayt);
           Console.Read();
        }       
    }
}
于 2011-05-06T17:51:36.993 に答える