0

複数のモニターが拡張デスクトップとして接続された Windows システムを使用しています。ユーザーにはプライマリ モニターのみが物理的に表示されるため、そのモニターにマウスをトラップしたいと考えています。

trap-mouse-in-wpf で説明されているように、ClipMouse API 関数を使用した簡単な解決策が 1 つあります。

[DllImport("user32.dll")]
static extern void ClipCursor(ref System.Drawing.Rectangle rect);

private void TrapMouse()
        {
            System.Drawing.Rectangle r = new System.Drawing.Rectangle(x, y, width, height);
            ClipCursor(ref r);
        }

ただし、alt-tab を使用してプログラムを変更したり、セカンダリ タッチ スクリーンの 1 つに触れたりすると、マウスが簡単に壊れてしまいます。

1 つのモニターでマウスを確実かつ永続的にキャプチャする方法はありますか?

4

1 に答える 1

0

簡単な Windows フォーム コードを次に示します。SetWindowsHookEx 関数を使用して、グローバル マウス フックを設定します。フック メソッドでは、マウス座標がプライマリ スクリーンの境界内にあるかどうかを確認し、必要に応じて座標を調整します。このコードを実行すると、マウスを動かしている限り、マウス カーソルは主要な画面領域から離れることができますが、クリック イベントが発生するとすぐに元に戻ります。これが起こらないようにするには、私のコードを ClipCursor テクニックと組み合わせてください。

public partial class Form1 : Form
{
    private const int WH_MOUSE_LL = 14;

    private delegate int HookProc(int code, IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll", EntryPoint = "SetWindowsHookEx", SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetModuleHandle(string lpModuleName);

    Rectangle _ScreenBounds;

    HookProc _HookProc;

    public Form1()
    {
        InitializeComponent();

        _ScreenBounds = Screen.PrimaryScreen.Bounds;
        _HookProc = HookMethod;
        IntPtr hook = SetWindowsHookEx(WH_MOUSE_LL, _HookProc, GetModuleHandle("user32"), 0);
        if (hook == IntPtr.Zero) throw new System.ComponentModel.Win32Exception();
    }

    private int HookMethod(int code, IntPtr wParam, IntPtr lParam)
    {
        if (Cursor.Position.X < _ScreenBounds.Left)
        {
            Cursor.Position = new Point(_ScreenBounds.Left, Cursor.Position.Y);
        }
        else if (Cursor.Position.X > _ScreenBounds.Right)
        {
            Cursor.Position = new Point(_ScreenBounds.Right - 1, Cursor.Position.Y);
        }

        if (Cursor.Position.Y < _ScreenBounds.Top)
        {
            Cursor.Position = new Point(Cursor.Position.X, _ScreenBounds.Top);
        }
        else if (Cursor.Position.Y > _ScreenBounds.Bottom)
        {
            Cursor.Position = new Point(Cursor.Position.X, _ScreenBounds.Bottom - 1);
        }

        return 0;
    }
}
于 2014-07-22T21:25:52.620 に答える