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

时间:2009-08-25 14:41:04

标签: c# windows winforms

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

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

我知道处理此问题的一个常见建议是禁用所有控件,但这也会重绘大部分屏幕,因此我正在寻找阻止所有用户输入的另一种方法。非常感谢任何帮助!

更新:我应该提到我们已经考虑了模态对话框。目前我们显示叠加层,启动数据访问线程然后构造表单。如果没有更好的方法来阻止输入(App.BlockInput()可能很好)那么我们可以使用模态对话框的想法,但我们需要等到表单构造完成并且目前还没有一个好的,中央的这样做的位置。

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

但是,如果您的用户可以在运行Web服务请求时执行操作,则最好让控件可以访问。至少,应始终有一种方法来中断/中止该过程。

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

答案 2 :(得分:3)

使用Application.AddMessageFilter可能会这样做: Capturing Mouse Events from every component on C# WInForm

答案 3 :(得分:2)

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

如果有人对如何处理鼠标输入有一个好主意,那么你已经设置好了。

答案 4 :(得分:0)

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

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

就鼠标输入而言,您可以通过挂钩WinProc messages并拦截mouse input messages来禁用鼠标活动。这基本上就是KeyPreview所做的。