2013-03-25 19 views
7

私はこの機能を使ってカーソルを移動しています。私はそれをトリガするためにホットキーを使用するとき信頼できるMouseMove(ホップ)

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

は、カーソルが正しいCOORDSに移動し、次回は私はそれがその位置から続けてマウスを移動します。意図したとおりに働く。

しかし、MouseMoveイベント中にSetCursorPosをトリガする必要があります。ユーザーが特定のエリアにマウスを移動すると、別の場所にジャンプしてそこから移動したいと思う。しかし、今はそれが目的地に向かってホップし、すぐに戻ってくる(時間の90%)。どうすればそのような行動を避けることができますか?

編集:1 mousemoveイベントで1 px squareでカーソルをクリッピングして回避することにしました。 Cursor.Clip(MousePosition、新しい長方形(1,1));

+4

MouseMoveイベントハンドラコードを投稿してください。 –

+0

私は文字通り、その関数を呼び出すだけで、MouseMoveイベントでは何も呼び出されません。 – user1340531

+0

@ user1340531:とにかく投稿しますか? – mpen

答えて

1

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

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

enter image description here

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

enter image description here

そして、ここでのコード(これは明らかに、単一のメソッドにリファクタリングすることができます)です:

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); 
      } 
     } 
    } 
} 
+0

私のMouseMoveイベントは実際にはグローバルで、カーソルが動いている限り、私がホバリングしているものであってもトリガーされます。 – user1340531

+2

@ user1340531他のコメント作成者が述べたように、そのコードを質問に追加する必要があります。 – Inisheer

+1

グローバルフックをインストールしていない限り、主に「グローバル」MouseMoveイベントなどは存在しないためです。 –

0

、このような少ない情報で言うのは難しいが(多分あなたのGUIのスクリーンショットが役立つだろう) 。 試してみることができます:

private void Button_MouseMove_1(object sender, MouseEventArgs e) 
    { 
     SetCursorPos(0, 0); 
     e.Handled = true; 
    }