c# - 防止鼠标离开我的表单

标签 c# .net mouse mouseevent mousemove

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

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

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

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


关于游戏的附加信息:

该游戏是一款时长 5-30 秒的短生存游戏(30 秒后变得太难让你无法存活),你必须用鼠标躲避子弹。当您将鼠标移出窗体然后播放器(连接到鼠标的 System.Windows.Forms.Panel)停止移动并立即被子弹击中时,这真的很烦人。这就是防止鼠标离开该区域的原因。

最佳答案

迟到的答案,但可能会派上用场。您可以为表单订阅 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's answer比我的回答更有意义。在 MouseEnter 上使用 Cursor.Clip :

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

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

Cursor.Clip = Rectangle.Empty;

关于c# - 防止鼠标离开我的表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15029274/

相关文章:

c# - 如何将 "NULL/DbNull"发送到数据类型为 : nullable int 的表列中

c# - 从oracle数据库导入验证检查

c# - 将控件设置为最顶部的 silverlight

.net - 双 slider 控制.net

cocoa - - (无效)鼠标按下 :(NSEvent *)theEvent not firing

winforms - 如何在 Powershell 表单中向鼠标右键菜单添加选项

c++ - 绘制始终位于最上方的移动图标,如鼠标光标,适用于全屏应用程序

c# - 映射到具有内部构造函数的自定义类型

.net - 无法使用 VS2008 SP1 进入 .NET Framework 源代码

.net - 使用相同的引用变量与单独的变量。 .Net中引用变量的费用