Я хотел бы создать непроницаемый край на моем рабочем столе, чтобы защитить «зону». То, что я ищу, похоже на ловушку мыши, но я не хочу быть строго ограниченным прямоугольником, поскольку он будет использоваться в мультимониторных установках, где область рабочего стола может быть не идеальным прямоугольником, а область, которую я хочу изолировать, может быть где-то посередине.
Я использую Gma.System.MouseKeyHook для подключения кабелей мыши, я знаю, что это не так сложно сделать в pinvoke, но я пошел по маршруту библиотеки.
Пока что у меня есть:
const uint MOUSEEVENTF_ABSOLUTE = 0x8000;
const uint MOUSEEVENTF_LEFTDOWN = 0x0002;
const uint MOUSEEVENTF_LEFTUP = 0x0004;
const uint MOUSEEVENTF_MIDDLEDOWN = 0x0020;
const uint MOUSEEVENTF_MIDDLEUP = 0x0040;
const uint MOUSEEVENTF_MOVE = 0x0001;
const uint MOUSEEVENTF_RIGHTDOWN = 0x0008;
const uint MOUSEEVENTF_RIGHTUP = 0x0010;
const uint MOUSEEVENTF_XDOWN = 0x0080;
const uint MOUSEEVENTF_XUP = 0x0100;
const uint MOUSEEVENTF_WHEEL = 0x0800;
const uint MOUSEEVENTF_HWHEEL = 0x01000;
[DllImport("User32.Dll")]
public static extern long SetCursorPos(int x, int y);
[DllImport("user32.dll")]
static extern void mouse_event(uint dwFlags, int dx, int dy, uint dwData, int dwExtraInfo);
private IKeyboardMouseEvents m_GlobalHook;
public MainWindow()
{
InitializeComponent();
m_GlobalHook = Hook.GlobalEvents();
m_GlobalHook.MouseMove += M_GlobalHook_MouseMove;
}
private void M_GlobalHook_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.X < 0)
{
//SetCursorPos(0, e.Y);
//mouse_event((int)MOUSEEVENTF_MOVE | (int)MOUSEEVENTF_ABSOLUTE, 0, e.Y, 0, 0);
System.Windows.Forms.Cursor.Position = new System.Drawing.Point(0, e.Y);
}
}
Проблема, с которой я сталкиваюсь, заключается в фактическом положении мыши, и курсор кажется абстрактным или не связанным друг с другом, поэтому я получаю странное мерцание назад и вперед между его положением в области, которую я пытаюсь избежать, и краем. Как видите, я пробовал пару разных методов, все ведут себя одинаково.
Обратите внимание, что для тестирования и упрощения моя область тестирования - это просто что-то с X <0, которое является одним из моих боковых мониторов. </p>