2012-12-28 12 views
5

私はマウスを画面全体に移動できる境界線を修正する小さなユーティリティを作成しようとしています。私はhere(私はバージョン1を使用しています)を見つけたグローバルマウスフックライブラリを使用し、マウスの位置情報を自分の関数に生成するイベントから渡しました。 。マウスの位置が動かないC#

internal void ProcessMouseEvent(System.Drawing.Point point) 
{ 
    Cursor.Position = new Point(50,50); 
} 

それを実行している場合は、マウスが指定された点に点滅するように見えるんが、それは動きのイベントだった場合、即座にそれを変更する前にあった場所に戻すだろう。クリックイベントによって実行された場合に限り、実際には新しい位置にとどまります。

答えて

3

マウスを効率的に使用できる場所を制限するには、cursor.clipを使用する必要があります。そのドキュメントhereがあります。それはあなたがもっと簡単にしたいことを行い、お勧めの方法です。

+0

境界が長方形ではない場合はどうなりますか? – littlerat

+0

@littleratあなたの質問には円は言及されていませんでした。 cursor.clipで矩形を使用する必要があります。ごめんなさい! – FrostyFire

+0

それはまったく円形ではありません。私がしようとしているのは、[this](http://i.imgur.com/6hpm.jpg)を[this](http://i.imgur.com/KhWb0.jpg)に変えることです。画面の解像度。 – littlerat

3

ここでの問題は、マウスメッセージの通知がフックに表示されることです。しかし、通知を実際に処理しようとしているアプリケーションによって処理されることはありません。だから、それは正常に処理され、マウスは移動したい場所に移動します。あなたがしなければならないことは、実際にメッセージが渡されるのをブロックすることです。それは、フックコールバックからゼロ以外の値を返す必要があります。

ライブラリでは、フックコールバックの戻り値を調整することを許可していないため、手術が必要になります。それはバグですのでご注意ください。代わりにthis sample codeを使用します。このサンプルコールバックメソッドを使用すると:

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { 
    if (nCode >= 0 && MouseMessages.WM_MOUSEMOVE == (MouseMessages)wParam) { 
     System.Windows.Forms.Cursor.Position = new Point(50, 50); 
     return (IntPtr)1; // Stop further processing! 
    } 
    return CallNextHookEx(_hookID, nCode, wParam, lParam); 
} 

これで固まってしまったことがわかります。 Alt + Tab、Alt + D、Eを使用して制御を取り戻します。

+0

私がしたことは、カーソルの位置を設定した直後に 'return new IntPtr(1)'を1回だけ追加して、それをそのまま残しておき、その後のイベントでもマウスを動かすことができました。 –

関連する問題