【问题标题】:Set mouse position not working c#设置鼠标位置不起作用c#
【发布时间】:2012-12-13 08:47:52
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# mouseevent mouse-hook


    【解决方案1】:

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

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

    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 重新获得控制权。

    【讨论】:

    • 很好的答案,我所做的是在设置光标位置后仅添加一次return new IntPtr(1),它保持在原位,仍然允许用户在后续事件中移动鼠标。
    【解决方案2】:

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

    【讨论】:

    • 如果我的边界不是矩形怎么办?
    • @littlerat 你的问题没有提到圆圈。您必须使用带有 cursor.clip 的矩形。对不起!
    • 嗯,它也不是圆形的。我想要做的是将this 变成this 而不实际更改屏幕分辨率。
    • @littlerat 好吧,我看不懂这些图像,但是带有 cursor.clip 的矩形剪辑应该可以工作。你为什么要这样做?
    • 我正在努力让我的鼠标移动在我拥有的三个不同尺寸的显示器上更加可预测。这有点难以解释,但是矩形夹子不起作用,因为我需要防止鼠标在各个角落移动。边界看起来像是之前 second image 中所有三个监视器的组合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    相关资源
    最近更新 更多