所以我试图创建一个用户将鼠标移动到表单的限制程序。我仍然希望用户看到表单后面发生了什么,但是除了我的表单之外无法点击任何内容。
我尝试使用此
Cursor.Clip = Me.RectangleToScreen(Me.ClientRectangle)
问题是如果用户点击标题栏上的某些位置......鼠标就会解锁。正在进行的机器有一个球型鼠标,所以如果你快速滚动并点击足够快......它也可以解锁。
我很困惑如何解决这个问题。
我在VB.NET 2.0中编码
提前致谢。
答案 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)删除剪切矩形。
另外,我很困惑为什么你说当光标剪辑生效时用户可以到标题栏上的图标,如果你真的剪裁到你的客户区,那是不可能的。快速跳出剪辑也是不可能的。