将鼠标限制为无法覆盖的表单

时间:2009-12-29 19:37:58

标签: .net vb.net

所以我试图创建一个用户将鼠标移动到表单的限制程序。我仍然希望用户看到表单后面发生了什么,但是除了我的表单之外无法点击任何内容。

我尝试使用此

Cursor.Clip = Me.RectangleToScreen(Me.ClientRectangle)

问题是如果用户点击标题栏上的某些位置......鼠标就会解锁。正在进行的机器有一个球型鼠标,所以如果你快速滚动并点击足够快......它也可以解锁。

我很困惑如何解决这个问题。

我在VB.NET 2.0中编码

提前致谢。

3 个答案:

答案 0 :(得分:2)

你需要的是全局Windows钩子。您可以随意滚动自己,也可以选择其他人在此处制作的DLL: http://www.vbforums.com/showthread.php?t=436321

如果你使用DLL,你只需要实例化它,安装钩子,连接事件,并记住在你完成后关闭它。我假设你可以处理GlobalMouseMove()

中的事情
Private MH As WindowsHook.MouseHook

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Me.MH = New WindowsHook.MouseHook()
    Me.MH.InstallHook()
    AddHandler Me.MH.MouseMove, AddressOf GlobalMouseMove
End Sub
Public Sub GlobalMouseMove()
    'Perform your logic here, Cursor.Position is desktop-based so you'll have to calculate relative to the form
    Trace.WriteLine(Cursor.Position)
End Sub
Protected Overrides Sub OnClosing(ByVal e As System.ComponentModel.CancelEventArgs)
    If Me.MH IsNot Nothing Then
        Me.MH.RemoveHook()
        Me.MH.Dispose()
        Me.MH = Nothing
    End If
    MyBase.OnClosing(e)
End Sub

答案 1 :(得分:1)

如果用户点击了您的应用程序之外,那么您就无法再进行控制了。你在做什么是一个坏主意。任何时候你试图限制鼠标,无论如何你都要求麻烦。为什么要这样做?

答案 2 :(得分:0)

剪切光标是您需要非常小心的事情。您应该只在按钮消息上执行此操作,并且仅在您捕获鼠标时执行此操作。

如果您意外放弃鼠标剪辑,则可以将系统置于不可用状态,直到重新启动。只知道如何使用鼠标操作系统的人将无法重启

所以,不要在家里试试。

如果Cursor.Clip不适合您,您可以尝试使用互操作来访问 原生的。 Pinvoke.net将原型显示为:

static extern bool ClipCursor(ref RECT lpRect);
Private Declare Function ClipCursor Lib "user32"(ByRef lpRect As RECT) As Long

完成后,请确保使用ClipCusor(NULL)删除剪切矩形。

另外,我很困惑为什么你说当光标剪辑生效时用户可以到标题栏上的图标,如果你真的剪裁到你的客户区,那是不可能的。快速跳出剪辑也是不可能的。