0

カーソルの移動方向を通知する eventargs を持つイベント MousePreMove が存在するかどうかを誰かに教えてもらえますか?

ユーザー入力をブロックする Win API を見つけましたが、探しているものではありません。

4

2 に答える 2

2

いいえ、MousePreMoveイベントはありませんが、独自に何かを記述してカーソルの方向を取得できます。例えば:

public partial class Form1 : Form {

    Point cursorPosition;
    Direction cursorDirection, previousCursorPosition;

    public event EventHandler<MouseDirectionEventArgs> DirectionChanged;

    public Form1( ) {
        InitializeComponent( );
        cursorPosition = PointToClient( Cursor.Position );

        DirectionChanged += new EventHandler<MouseDirectionEventArgs>( Form1_DirectionChanged );
    }

    void Form1_DirectionChanged( object sender, MouseDirectionEventArgs e ) {
        MessageBox.Show( e.MouseDirection.ToString( ) );
    }

    protected override void OnMouseMove( MouseEventArgs e ) {

        if ( e.X > cursorPosition.X && e.Y > cursorPosition.Y )
            cursorDirection = Direction.RightDown;
        else if ( e.X > cursorPosition.X && e.Y < cursorPosition.Y )
            cursorDirection = Direction.RightUp;
        else if ( e.X < cursorPosition.X && e.Y > cursorPosition.Y )
            cursorDirection = Direction.LeftDown;
        else if ( e.X < cursorPosition.X && e.Y < cursorPosition.Y )
            cursorDirection = Direction.LeftUp;

        OnDirectionChanged(new MouseDirectionEventArgs( cursorDirection ) );

        previousCursorPosition = new Point(cursorPosition.X, cursorPosition.Y);
        cursorPosition = e.Location;

        base.OnMouseMove( e );
    }

    protected virtual void OnDirectionChanged(MouseDirectionEventArgs e){
        if ( DirectionChanged != null )
            DirectionChanged( this, e );
    }
}

enum Direction {
    LeftUp,
    LeftDown,
    RightUp,
    RightDown
}

class MouseDirectionEventArgs : EventArgs {
    public readonly Direction MouseDirection {
        get;
        set;
    }

    public MouseDirectionEventArgs( Direction direction ) {
        MouseDirection = direction;
    }
}

これは、前のマウス位置と比較してマウスの方向を表示する単純なプログラムです。

編集:

マウスが特定の方向に動かないようにしたい場合は、次のようにする必要があります。

void Form1_DirectionChanged( object sender, MouseDirectionEventArgs e ) {
     if(e.MouseDirtection == Direction.LeftUp) //example
        Cursor.Position = PointToScreen( previousCursorPosition );
}
于 2012-07-21T18:23:48.383 に答える
0

マウスの動きを止めたい理由が本当にわかりません。これが作成する重要な問題は、ユーザーがマウスを動かすことができないということです (明らかに)。したがって、ユーザーがプログラムを使用しているときにこれを実装すると、たとえば [スタート] メニューをクリックできなくなります。

ただし、それがあなたの目標であるため、「マウスの動きを止める」から「マウスが必要な場所にない場合は、必要な場所に置く」に考え方を変えることで、より良いサービスが提供されます。

そのため、Fuex のコードに従って OnMouseMove イベントを使用し、次のようなものを使用します (これは単なる疑似コードです)。

cursorPosition = e.Location;

if(cursorPosition != alowedArea) { カーソル位置 = 貴重なカーソル位置; }

貴重なカーソル位置 = カーソル位置;

e.Location = cursorPosition;

于 2012-07-21T19:01:54.967 に答える