我正在尝试阻止模式对话框上的任何类型的用户输入,这些输入可用于执行需要几分钟才能完成的缓慢操作。到目前为止,我找到的唯一解决方案是简单地将表单的Enabled属性设置为false,但是这也会使整个表单变灰。除此之外,出于某种原因,它还阻止我显示等待光标,因为这似乎只有在表单未禁用时才有效。在操作未完成的情况下,如何阻止用户在表单上的输入,而不使表单变灰,同时仍允许我设置等待光标?
发布于 2020-12-12 10:59:22
我正在尝试阻止任何类型的用户输入
用户输入以窗口消息的形式发送到应用程序。您可以安装筛选器来阻止与键盘和鼠标输入相关的消息。这是通过定义一个实现IMessageFilter Interface的类来完成的,过滤器是通过调用Application.AddMessageFilter并传递类的一个实例来安装的。
下面定义了一个实现IMessageFilter的类。如果应用程序接收到在FilteredMessages枚举中定义的消息,它将阻止对该消息的进一步处理。该类是自包含的,并且公开了两个静态方法:
Public Class InputFilter : Implements IMessageFilter
Private Shared sharedInstance As InputFilter
Private handledMessages As FilteredMessages() = CType([Enum].GetValues(GetType(FilteredMessages)), FilteredMessages())
Private Sub New()
End Sub
Private Enum FilteredMessages
#Region "Keyboard"
WM_KEYDOWN = &H100
WM_KEYUP = &H101
WM_SYSKEYDOWN = &H104
WM_SYSKEYUP = &H105
#End Region
#Region "Mouse"
WM_LBUTTONDOWN = &H201
WM_LBUTTONUP = &H202
WM_LBUTTONDBLCLK = &H203
WM_RBUTTONDOWN = &H204
WM_RBUTTONUP = &H205
WM_RBUTTONDBLCLK = &H206
'prevent interaction with title bar
WM_NCLBUTTONDOWN = &HA1
WM_NCLBUTTONUP = &HA2
WM_NCLBUTTONDBLCLK = &HA3
WM_NCRBUTTONDOWN = &HA4
WM_NCRBUTTONUP = &HA5
WM_NCRBUTTONDBLCLK = &HA6
' prevent mouse hover/enter/move events
WM_MOUSEHOVER = &H2A1
WM_MOUSEMOVE = &H200
#End Region
End Enum
Public Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
Return handledMessages.Contains(CType(m.Msg, FilteredMessages))
End Function
Public Shared Sub Install()
If sharedInstance Is Nothing Then
sharedInstance = New InputFilter
Application.AddMessageFilter(sharedInstance)
End If
End Sub
Public Shared Sub Uninstall()
If sharedInstance IsNot Nothing Then
Application.RemoveMessageFilter(sharedInstance)
sharedInstance = Nothing
End If
End Sub
End Class若要测试此类,请创建一个新的WinForm项目,并向设计器中的窗体添加两个按钮、一个标签和一个文本框。然后用下面的代码替换窗体的代码。
Public Class Form1
Private tmr As New Timer() With {.Interval = 10000}
Private tickHandler As EventHandler = Sub(s, e)
tmr.Stop()
RemoveHandler tmr.Tick, tickHandler
InputFilter.Uninstall()
Label1.Text = "filter off"
Application.UseWaitCursor = False
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
InputFilter.Install()
Application.UseWaitCursor = True
AddHandler tmr.Tick, tickHandler
tmr.Start()
Label1.Text = "filter on"
Label1.Refresh()
TextBox1.Select()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
MessageBox.Show("clicked")
End Sub
End Class运行项目并单击Button1。Button1_Click处理程序安装过滤器,激活WaitCursor并启动计时器。计时器将在10秒后到期,并将卸载过滤器。当筛选器处于活动状态时,您将无法使用键盘或鼠标与窗体交互。
有关过滤邮件的信息,请参阅Mouse Input Notifications和Keyboard Input Notifications。
https://stackoverflow.com/questions/65249039
复制相似问题