7

この関数を使用してカーソルを移動しています。

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

ホットキーを使用してトリガーすると、カーソルは正しい座標に移動し、次にマウスを移動するとその位置から続行します。意図したとおりに動作します。

ただし、MouseMove イベント中に SetCursorPos をトリガーする必要があります。ユーザーがマウスを特定の領域に移動すると、別の場所に移動してそこから続行する必要があります。しかし、現時点では、宛先にホップしてすぐに戻ってきます (90% の確率)。どうすればその動作を回避できますか?

編集: 1 つの mousemove イベントに対して、カーソルを 1 x 1 px の正方形にクリップすることで回避することにしました。Cursor.Clip(MousePosition, new Rectangle(1, 1));

4

2 に答える 2

1

イベントをトリガーしたい領域のフォームの上に別のコントロールがあると思います。MouseMoveその場合、コントロールはイベントをキャプチャしています。

たとえば、ここでは、左上隅の位置 0, 0 に緑色の 200x200 パネルを追加しました。マウスがパネル上を移動すると、フォームのMouseMoveイベントはマウス カーソル位置のキャプチャを停止します。フォームのmouse_moveイベントで、マウス座標を表示するようにフォームのテキストを設定しました。マウスが実際には 0, 0 にあるとき、ウィンドウ テキストの座標はまだ 200, 200 であることに注意してください (スクリーンショットを取得するには SnippingTool.exe をクリックする必要があるため、カーソルが表示されません)。

ここに画像の説明を入力

これを解決するには、フォームのイベントに配置したのと同じコードをMouseMoveパネルのMouseMoveイベント (または使用しているコントロール) に使用します。これにより、フォームのテキストで正しい座標が得られます。

ここに画像の説明を入力

コードは次のとおりです (これは明らかに 1 つのメソッドにリファクタリングできます)。

public partial class Form1 : Form
{
    [DllImport("user32.dll")]
    static extern bool SetCursorPos(int X, int Y);

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        this.Text = string.Format("X: {0}, Y: {1}", e.X, e.Y);

        if (e.X >= 0 && e.X <= 200)
        {
            if (e.Y >= 0 && e.Y <= 200)
            {
                SetCursorPos(500, 500);
            }
        }
    }

    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        this.Text = string.Format("X: {0}, Y: {1}", e.X, e.Y);

        if (e.X >= 0 && e.X <= 200)
        {
            if (e.Y >= 0 && e.Y <= 200)
            {
                SetCursorPos(500, 500);
            }
        }
    }
}
于 2013-03-25T01:56:40.377 に答える