5

我一直在尝试编写一个小实用程序来修改鼠标在整个屏幕上的移动范围。我使用了在这里找到的全局鼠标钩子库(我使用的是版本 1),然后将鼠标位置信息从它生成的事件传递给我自己的函数(只是一个测试,看看它现在是否工作) .

internal void ProcessMouseEvent(System.Drawing.Point point)
{
    Cursor.Position = new Point(50,50);
}

运行它时,鼠标确实会闪烁到指定点,但如果它是一个移动事件,它会立即恢复到更改之前的位置。只有当它通过点击事件完成时,它才会真正保持在新位置。

4

2 回答 2

3

要限制鼠标有效移动的位置,您需要使用 cursor.clip。你可以在这里找到它的文档。它会更轻松地完成您想要的操作,并且是推荐的方式。

于 2012-12-28T01:48:52.670 回答
3

这里的问题是钩子给你一个鼠标消息的通知。但不会阻止它被实际处理通知的应用程序处理。所以它被正常处理,鼠标移动到它想去的地方。你需要做的实际上是阻止消息被传递,这需要从钩子回调中返回一个非零值。

该库不允许您修改挂钩回调返回值,这将需要手术。当心它是越野车。我将改为使用此示例代码。使用此示例回调方法:

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) {
    if (nCode >= 0 && MouseMessages.WM_MOUSEMOVE == (MouseMessages)wParam) {
        System.Windows.Forms.Cursor.Position = new Point(50, 50);
        return (IntPtr)1;   // Stop further processing!
    }
    return CallNextHookEx(_hookID, nCode, wParam, lParam);
}

你会看到它现在被牢牢地卡住了。使用 Alt+Tab、Alt+D、E 重新获得控制权。

于 2016-10-15T00:38:40.477 回答