4

XC# コードを使用してマウスを移動およびクリックするために必要なすべてのコードがありますが、マウスの位置をandに設定したくありませんY。それはぎこちなく見えます。代わりに、 Z 秒間X1, Y1でポイントからポイントへのスムーズな遷移が必要です。X2, Y2キーフレームに似ています。

私はこれに似た方法を探しています:

public void TransitionMouse(int x, int y, double durationInSecs)

マウスを現在の位置から数秒でスムーズに移動xしますydurationInSecs次の関数があります。

public void MoveMouse(int x, int y)

xこれにより、マウスがyすぐに に移動します。


編集

助けてくれてありがとう!完成し、テストされたコードは次のとおりです。

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

    public void TransitionMouseTo(double x, double y, double durationSecs)
    {
        double frames = durationSecs*100;

        PointF vector = new PointF();
        PointF mousePos = Cursor.Position;

        vector.X = (float)((x - mousePos.X) / frames);
        vector.Y = (float)((y - mousePos.Y) / frames);

        for (int i = 0; i < frames; i++)
        {
            SetCursorPos((int)(mousePos.X += vector.X), (int)(mousePos.Y += vector.Y));
            Thread.Sleep((int)((durationSecs / frames) * 1000.0));
        }
    }
4

2 に答える 2

7

これはいくつかの方法で行うことができます。1 つのオプションは、フレームごとにマウスを移動するために必要なベクトルを計算し、一定期間にわたってマウスの位置に適用することです。

したがって、位置 5,5 にいて、10 フレームで 20,30 に移動したい場合、ベクトルは次のようになります。

val = (ターゲット - 開始) / フレーム;

x = (20 - 5) / 10; y = (30 - 5) / 10;

ベクトル = 1.5,2.5

次に、TransitionMouse メソッドで、速度を制御する Thread.Sleep メソッドを使用して、ベクトルをマウスの位置に任意の期間ゆっくりと適用します。コードは次のようになります。

public void TransitionMouseTo(int x, int y, int durationSecs)
{
    int frames = 10;

    PointF vector = new PointF();

    vector.X = (x - Cursor.Position.X) / frames;
    vector.Y = (y - Cursor.Position.Y) / frames;  

    for (int i = 0; i < frames; i++)
    {
        Point pos = Cursor.Position;

        pos.X += vector.X;
        pos.Y += vector.Y;

        Cursor.Position = pos;

        Thread.Sleep((durationSecs / frames) * 1000);
    }
}

もう 1 つの方法は、ブレゼンハム アルゴリズムを使用してマウス カーソルが移動するすべてのポイントを計算し、各ポイントをループして、Thread.Sleep を使用して再びカーソルに適用し、タイミングを正しく保つことです。

スティーブ

于 2010-10-25T14:46:46.487 に答える
0

実際にはスムーズの定義に依存しますが、「スムーズ」モーションのほとんどのアルゴリズムはスプラインを使用して 2 つ以上のデータ ポイント間を補間します。

これはhttp://geekswithblogs.net/JuanDoNeblo/archive/2007/10/25/Data-Interpolation-with-SPLINE-in-Csharp.aspxに役立つ 可能性があります

于 2010-10-25T14:28:30.163 に答える