7

我已将一些事件附加MouseMoveMouseClick我的程序中,接下来是其中之一:

  1. 获取“全局”鼠标移动,这样我即使在表单之外也可以读取鼠标位置。
  2. 首先防止我的鼠标离开表单。

我的项目是一个游戏,因此可以像大多数其他游戏一样防止鼠标离开我的表单(ofc。如果您使用 alt+tab fe 切换焦点,您可以将其移出。)并查看其他游戏的答案要求全球mosue运动的问题,对于我的需求来说似乎很混乱。

有没有一种简单的方法可以防止我的鼠标超出表单的边界?或者实际上为了防止它首先越过边界,我希望鼠标留在客户区域内。


关于游戏的附加信息:

该游戏是一个简短的 5-30 秒长的生存游戏(30 秒后变得太难让你活着),你必须用鼠标躲避子弹。当您将鼠标移出表单然后玩家(System.Windows.Forms.Panel连接到鼠标)停止移动并立即被子弹击中时,这真的很烦人。这就是为什么防止鼠标离开该区域会很好的原因。

4

5 回答 5

5

迟到的答案,但可能会派上用场。您可以订阅表单MouseLeaveMouseMove事件并像这样处理它们:

    private int X = 0;
    private int Y = 0;

    private void Form1_MouseLeave(object sender, EventArgs e)
    {
        Cursor.Position = new Point(X, Y);
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if (Cursor.Position.X < this.Bounds.X + 50 )
            X = Cursor.Position.X + 20;
        else
            X = Cursor.Position.X - 20;

        if (Cursor.Position.Y < this.Bounds.Y + 50)
            Y = Cursor.Position.Y + 20;
        else
            Y = Cursor.Position.Y - 20;           
    }

以上将确保鼠标光标永远不会离开表单的边界。确保在游戏结束后取消订阅事件。

编辑 :

Hans Passants 的回答比我的回答更有意义。用于:Cursor.Clip_MouseEnter

private void Form1_MouseEnter(object sender, EventArgs e)
    {
        Cursor.Clip = this.Bounds;
    }

如果出现任何错误/崩溃,您可以释放光标(我相信您可以抓住它们):

Cursor.Clip = Rectangle.Empty;
于 2013-02-22T18:11:26.377 回答
4

您不能捕获鼠标,否则会阻止用户操作“开始”菜单。您可以获得的最接近的是分配 Cursor.Clip 属性。但是它很容易被用户按 Ctrl+Esc 打败,例如,没有通知。

最好的办法是订阅表单的 Deactivated 事件,它可靠地告诉您用户切换到另一个程序。激活事件告诉您用户何时移回。当然,当游戏得分取决于保持游戏对象移动时,用户实际上没有理由这样做。所以不要忘记给用户一个简单的方法来暂停游戏,比如 Escape 键。

于 2013-02-22T17:33:29.263 回答
2

我不知道您的确切问题的解决方案,但我对您有一个完全不同的想法。我不知道你的游戏是如何工作的,但根据你告诉我的,为什么不让它更难一点:为游戏区域添加边框,例如 4 像素宽的矩形,你不能触摸。如果你触摸它们,你就会死去,鼠标就会被释放。

于 2013-02-22T17:21:37.170 回答
1

你可以使用Cursor类。例如:

int X = Cursor.Position.X;
int Y = Cursor.Position.Y;

至于防止用户将鼠标移到表单外,最好的方法可能是如果您有办法知道表单在屏幕上的坐标是什么并附加一个MouseMove事件,并检查鼠标是否在表单矩形内.

要了解屏幕上的表单位置,请查看问题。

于 2013-02-22T17:03:33.567 回答
0

我不推荐全局鼠标移动控制有两个原因。

  • 这是糟糕的设计,您应该尊重操作系统的界限。如果您想要这种行为,请让应用程序全屏显示。唯一应该执行此类操作的应用程序是“kiosk”模式应用程序,它会锁定整个操作系统(以防止操作员滥用)。

  • 全局键挂钩很混乱,不能保证有效并且很危险,因为它们会影响操作系统的关键部分(所有控件)。代码中的错误可能导致需要重新启动计算机。

也就是说,上次我检查(不久前,在 Vista 上)SetWindowsHookEx仍然有效(但它不受官方支持的 IIRC),它是一个非托管调用,所以你必须 pinvoke 但有了它你可以拒绝传递会将鼠标移到应用程序的边界之外。我不是 100% 确定操作系统是否会让你击败光标控制(我之前只在桌面机器上阻止过键盘),但它可能是你最好的选择。

于 2013-02-22T17:42:29.207 回答