C# 如何阻止WinForms应用程序的所有键盘和鼠标输入?

C# 如何阻止WinForms应用程序的所有键盘和鼠标输入?,c#,windows,winforms,C#,Windows,Winforms,我有一个WinForms应用程序正在从工作线程上的web服务检索数据,我需要禁用对我的应用程序的所有输入,直到加载数据 目前,我创建了一个半透明表单并将其放置在我的应用程序上。数据调用完成后,我关闭此覆盖表单。这可以很好地工作,因为它会给通过终端服务运行应用程序的用户带来相当大的性能问题。我试图使覆盖完全透明,但这仍然会触发整个窗口的两次重画,所以这根本没有帮助 我知道处理这个问题的一个常见建议是禁用所有控件,但这也会重新绘制大部分屏幕,所以我正在寻找另一种方法来阻止所有用户输入。任何帮助都将不

我有一个WinForms应用程序正在从工作线程上的web服务检索数据,我需要禁用对我的应用程序的所有输入,直到加载数据

目前,我创建了一个半透明表单并将其放置在我的应用程序上。数据调用完成后,我关闭此覆盖表单。这可以很好地工作,因为它会给通过终端服务运行应用程序的用户带来相当大的性能问题。我试图使覆盖完全透明,但这仍然会触发整个窗口的两次重画,所以这根本没有帮助

我知道处理这个问题的一个常见建议是禁用所有控件,但这也会重新绘制大部分屏幕,所以我正在寻找另一种方法来阻止所有用户输入。任何帮助都将不胜感激


更新:我应该提到我们已经考虑了模态对话框。当前,我们显示覆盖,启动数据访问线程,然后构建表单。如果没有更好的方法阻止输入(App.BlockInput()可能会更好),那么我们可以使用模式对话框的想法,但我们需要等到表单构造完成,并且当前没有一个好的中心位置来执行此操作。

您可以显示一个小模式(
modalForm.ShowDialog(yourForm)
)在应用程序顶部滚动进度条的表单。这不会导致重绘大区域。

对于键盘输入,您可以尝试将表单的KeyPreview属性设置为True。这将首先将所有键盘事件传递给窗体对象,而不是单个控件。为窗体的KeyPress事件创建一个事件处理程序,在其中可以将KeyPressEventArgs的Handled属性设置为True,以防止将按键笔划传递给任何控件。如果当前正在从web服务检索数据,请将Handled属性设置为True,否则将其设置为False,键笔划将传递给控件


如果有人对如何处理鼠标输入有很好的想法,那么您已经设置好了。

如果您的应用程序在操作运行时确实被阻止,我会做Microsoft经常做的事情:打开一个带有某种跳动器动画或进度条的模式对话框,以及一个取消按钮。重画是有限的,因为您只绘制了新对话框的大小,而对应用程序其余部分的输入被阻止,因为对话框是模态的。此外,当你有一些状态更新和/或动画时,用户更愿意等待,因为看起来计算机正在“工作”

但是,如果在web服务请求运行时用户可以执行某些操作,那么最好让控件保持可访问状态。至少,应该始终有一种方法来中断/中止进程


更新:既然您现在更改了问题:构建模式对话框需要多长时间?为什么不简单地将对话框构造为空,然后填充其控件?如果您只有一个带有单个按钮和单个进度条的小对话框,那么调用dialog.ShowDialog()的速度应该比您的用户能够与UI交互的速度更快。不是这样吗?

我通常会在表单中创建一个LockUI()和UnlockUI()函数,用于切换控件并翻转一个本地表单字段,该字段充当一个标志以指示长时间运行的进程。如果使用命令模式,这种方法非常有效

如前所述,您可以使用表单的KeyPreview属性来切换键盘输入(如TLiebe所建议的)


就鼠标输入而言,您可以通过挂接和拦截来禁用鼠标活动。这基本上就是KeyPreview所做的。

Aargh,你只需几秒钟就把我打败了。。。我同意,这可能是解决这个问题的最好办法。另外,模式对话框的优点是,它不太可能像锁定表单那样迷惑用户。对不起,我忘了提到我们已经考虑过这个问题。您可以查看我对问题的更新以了解更多信息。这可能是最好的选择,但不适合我们现有的代码库。WinForms的好时光。Silverlight全异步模型很难处理。吉姆,也许你可以给我们看一些代码。构建表单的成本是否如此之高,以至于您需要考虑它?在代码中似乎是一种“床味”。我同意这里可能有一种“臭味”。我们有一个相当复杂的UI,其中有管理窗口的控制器层。我们可能可以很容易地实现这一点,但这似乎是一个常见的场景,我很惊讶没有一种简单、集中的方法来实现这一点,比如App.BlockInput()。感谢您的建议。我以前使用过KeyPreview,但从未考虑过这一点。