2013-08-12 2 views
0

У меня есть система Windows с несколькими мониторами, подключенными как расширенный рабочий стол. Только основной монитор физически виден пользователю, поэтому я хочу заманить мышь на этот монитор.Ловушка мыши на одном мониторе

Там, кажется, одно простое решение с использованием функции API ClipMouse, как описано в trap-mouse-in-wpf:

[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 или при касании одного из вторичных сенсорных экранов.

Есть ли способ надежно и постоянно фиксировать мышь на одном мониторе?

ответ

0

Вот простой код Windows Forms, который вы можете попробовать. Он использует функцию SetWindowsHookEx для установки глобального мышиного крючка. В методе hook он проверяет, находятся ли координаты мыши в пределах основного экрана, и при необходимости корректирует координаты. Когда вы запустите этот код, курсор мыши все равно сможет покинуть основную область экрана, пока вы просто перемещаете мышь, но она будет отскакивать, как только произойдет событие щелчка. Возможно, вы захотите совместить мой код с технологией 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; 
    } 
} 
+0

Благодарим за этот фрагмент! Мы играли с ним, но поскольку он срабатывает только после нажатия или отпускания кнопки мыши, это действительно не решает нашу проблему. Поэтому мне нужно найти что-то еще. –

Смежные вопросы