何らかの状態が発生した場合にマウスの動きを防ぐ方法を探しています。
手遅れなので、OnMouseMoveイベントを処理したくないことに注意してください。
Cursor.Clipプロパティのようなものが必要です。マウスの移動方向を無効にできるAPIはありますか?一種のApiMouse.DisableMovement(Directio.Up | Direction.Down | Direction.Left | Direction.Right)?
オーバーライドが気に入らない場合OnMouseMove
は、おそらくWndProcをオーバーライドするのが好きでしょう。ウィンドウのマウス移動メッセージを「キャッチ」し、ルールに従ってそれらを破棄します。これは私が知っている最速の方法です。
private const int WM_MOUSEMOVE = 0x0200;
private const int MK_LBUTTON = 0x0001;
protected override void WndProc(ref Messsage msg)
{
switch(msg.Msg)
{
case WM_MOUSEMOVE: // If you don't want the cursor to move, prevent the code from reaching the call to base.WndProc
switch (msg.WParam.ToInt32())
{
case MK_LBUTTON: // the left button was clicked
break;
}
break;
}
base.WndProc(ref msg);
}
LParam
およびを使用しWParam
て、マウスの現在の状態に関する詳細情報を提供します。理解を深めるためにこれを確認してください。
マウス の座標を取得するには、この質問を確認してください。。それは次のことを示しています:
int x = msg.LParam.ToInt32() & 0x0000FFFF;
int y = (int)((msg.LParam.ToInt32() & 0xFFFF0000) >> 16)
Point pos = new Point(x, y);
以前の回答へのコメントでは、以前の質問「フォームがクライアントデスクトップ領域内に移動する」を参照しています。受け入れられた回答のコードは、ウィンドウがデスクトップの外に移動するのを防ぎます。次に、ユーザーがウィンドウをドラッグしているときに、カーソルをウィンドウに「固定」します。したがって、ウィンドウをそれ以上移動できない場合は、カーソルもそれ以上移動しないでください。
あなたの質問に対する私の理解が正しければ、WM_NCLBUTTONDOWNメッセージを処理して、マウスの動きの制限を計算する必要があります。Cursor.Clip
次に、これらの制限を適用するために使用できます。
ただし、WM_NCLBUTTONDOWNメッセージでクリップ長方形を適用すると、すぐに削除されます。代わりにWM_MOVINGメッセージで適用すると、ドラッグが終了すると自動的に削除されます。
これは、前述の質問に対する解決策でもあります。ユーザーがウィンドウをドラッグしているときに、計算された長方形内でのみマウスを移動できる場合、ウィンドウ自体は許可された領域内でのみ移動できます。
public const int WM_MOVING = 0x0216;
public const int WM_NCLBUTTONDOWN = 0x00A1;
public const int HT_CAPTION = 0x0002;
private Rectangle _cursorClip = Rectangle.Empty;
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCLBUTTONDOWN:
if (m.WParam.ToInt32() == HT_CAPTION)
{
Point location = Cursor.Position;
Rectangle screenBounds = Screen.PrimaryScreen.Bounds;
Rectangle formBounds = Bounds;
_cursorClip = Rectangle.FromLTRB(location.X + screenBounds.Left - formBounds.Left,
location.Y + screenBounds.Top - formBounds.Top,
location.X + screenBounds.Right - formBounds.Right,
location.Y + screenBounds.Bottom - formBounds.Bottom);
}
break;
case WM_MOVING:
Cursor.Clip = _cursorClip;
break;
}
base.WndProc(ref m);
}