设置鼠标位置不起作用的解决方法(C#)

5

我一直在尝试编写一个小工具,可以修改整个屏幕上鼠标可以移动的范围边界。我使用了我在这里找到的全局鼠标钩子库(我正在使用版本1),然后将它生成的事件中的鼠标位置信息传递给我的自定义函数(现在只是测试是否正常工作)。

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

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

2个回答

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来恢复控制。


非常好的答案,我的做法是在设置光标位置后只添加了一次return new IntPtr(1),它仍然保持在原位,并允许用户在后续事件中移动鼠标。 - MathuSum Mut

3
为了更有效地限制鼠标移动的范围,您需要使用 cursor.clip。您可以在此处找到其文档(链接)。它将更轻松地实现您想要的效果,并且是推荐的方法。

如果我的边界不是矩形的呢? - littlerat
@littlerat,你的问题没有提到圆形。你必须使用带有cursor.clip的矩形。抱歉! - FrostyFire
好吧,它也不是圆形的。我试图做的是将这个变成这个,但实际上并没有改变屏幕分辨率。 - littlerat
@littlerat 嗯,我不太理解这些图片,但是使用 cursor.clip 进行矩形剪辑应该可以解决问题。你为什么想要这样做呢? - FrostyFire
我正在尝试使我的鼠标在我拥有的三个不同大小的显示器上移动更加可预测。这有点难以解释,但矩形剪辑无法使用,因为我需要防止鼠标在各种角落移动。边界看起来像早期第二张图片中所有三个监视器的组合。 - littlerat
@littlerat 很抱歉,我无法再为您提供更多帮助。 - FrostyFire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接