首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VB.NET -如何在windows窗体上阻止用户输入而不将其灰显?

VB.NET -如何在windows窗体上阻止用户输入而不将其灰显?
EN

Stack Overflow用户
提问于 2020-12-11 17:48:05
回答 1查看 110关注 0票数 0

我正在尝试阻止模式对话框上的任何类型的用户输入,这些输入可用于执行需要几分钟才能完成的缓慢操作。到目前为止,我找到的唯一解决方案是简单地将表单的Enabled属性设置为false,但是这也会使整个表单变灰。除此之外,出于某种原因,它还阻止我显示等待光标,因为这似乎只有在表单未禁用时才有效。在操作未完成的情况下,如何阻止用户在表单上的输入,而不使表单变灰,同时仍允许我设置等待光标?

EN

回答 1

Stack Overflow用户

发布于 2020-12-12 10:59:22

我正在尝试阻止任何类型的用户输入

用户输入以窗口消息的形式发送到应用程序。您可以安装筛选器来阻止与键盘和鼠标输入相关的消息。这是通过定义一个实现IMessageFilter Interface的类来完成的,过滤器是通过调用Application.AddMessageFilter并传递类的一个实例来安装的。

下面定义了一个实现IMessageFilter的类。如果应用程序接收到在FilteredMessages枚举中定义的消息,它将阻止对该消息的进一步处理。该类是自包含的,并且公开了两个静态方法:

  1. Install
  2. Uninstall

代码语言:javascript
复制
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项目,并向设计器中的窗体添加两个按钮、一个标签和一个文本框。然后用下面的代码替换窗体的代码。

代码语言:javascript
复制
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

运行项目并单击Button1Button1_Click处理程序安装过滤器,激活WaitCursor并启动计时器。计时器将在10秒后到期,并将卸载过滤器。当筛选器处于活动状态时,您将无法使用键盘或鼠标与窗体交互。

有关过滤邮件的信息,请参阅Mouse Input NotificationsKeyboard Input Notifications

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65249039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档