我已将一些MouseMove
和MouseClick
个事件附加到我的程序中,接下来就是其中之一:
我的项目是一款游戏,因此像大多数其他游戏一样防止鼠标离开我的形状真是太棒了(如果你用alt + tab fe切换焦点,你可以把它移出来)并看一看回答其他问题要求全球性的运动,他们似乎对我的需求非常混乱。
是否有一种简单的方法可以阻止我的鼠标移出我的表格边框?或者实际上为了防止它首先超出边界,我希望鼠标留在客户区内。
有关游戏的其他信息:
游戏是一个短暂的,长达5到30秒的生存游戏(在你活着的30秒后变得太难了)你必须用你的鼠标躲避子弹。当你将鼠标移出表格然后播放器(鼠标附加System.Windows.Forms.Panel
)停止移动并立即被子弹击中时,这真的很烦人。这就是为什么防止鼠标离开该区域会很好。
答案 0 :(得分:5)
迟到的答案但可能会派上用场。您可以将表单订阅到MouseLeave
和MouseMove
个事件并按照以下方式处理:
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比我的回答更有意义。在Cursor.Clip
上使用MouseEnter
:
private void Form1_MouseEnter(object sender, EventArgs e)
{
Cursor.Clip = this.Bounds;
}
如果出现任何错误/崩溃,你可以释放光标(我确定你可以抓住它):
Cursor.Clip = Rectangle.Empty;
答案 1 :(得分:4)
您无法捕获鼠标,这会阻止用户操作“开始”菜单。最接近的是分配Cursor.Clip属性。但是用户按Ctrl + Esc很容易就会失败,例如,没有通知。
最好的办法是订阅表单的Deactivated事件,它可靠地告诉您用户切换到另一个程序。 Activated事件告诉您用户何时向后移动。当然,当游戏得分取决于保持游戏对象移动时,用户几乎没有理由实际执行此操作。所以不要忘记给用户一个简单的方法来暂停游戏,例如Escape键。
答案 2 :(得分:2)
我不知道您确切问题的解决方案,但我对您有完全不同的想法。我不知道你的游戏是如何运作的,但是根据你告诉我的内容,为什么不更加努力:在游戏区域添加边框,例如4像素宽的矩形,你不允许触摸。如果你触摸它们,你就死了,鼠标就会被释放。
答案 3 :(得分:1)
您可以使用Cursor
课程。例如:
int X = Cursor.Position.X;
int Y = Cursor.Position.Y;
至于阻止用户将鼠标移动到表单之外,最好的方法可能是如果您已经知道屏幕上表单的坐标是什么并附加MouseMove
事件,并检查如果鼠标位于表格矩形内。
要了解屏幕上的表单位置,请查看this问题。
答案 4 :(得分:0)
我不建议全局鼠标移动控制有两个原因。
这是糟糕的设计,你应该尊重操作系统的界限。如果您想要这种行为,请将应用程序全屏显示。应该执行这些操作的唯一应用程序是“kiosk”模式应用程序,它们锁定整个操作系统(以防止操作员滥用)。
全局密钥挂钩很乱,无法保证工作且危险,因为它们会影响操作系统的关键部分(所有控件)。代码中的错误可能导致需要重新启动计算机。
那就是说,上次我检查(前一段时间,在Vista上)SetWindowsHookEx仍然有效(但它没有得到官方支持的IIRC),这是一个非管理的呼叫,所以你必须用pinvoke但用它就可以了拒绝传递会将鼠标移动到应用程序范围之外的消息。我不是100%确定操作系统是否会让你将它击败光标控制(我之前只在桌面盒上阻止了键盘)但它可能是你最好的镜头。