我在winform的代码隐藏文件中执行此操作时出现问题:
// Waiting Cursor + disabling form
Cursor = Cursors.WaitCursor;
this.Enabled = false;
// Synchronous method
SomeWork();
// Re-enabling form
Cursor = Cursors.Default;
this.Enabled = true;
当前行为
例如,在Somework()
期间单击按钮将在重新启用表单后执行与按钮关联的方法。
预期行为
我不希望表单在表单被禁用时存储用户的点击事件。
问题
有没有办法清空表单的单击缓存(这样我在重新启用表单之前就会这样做)?
重要编辑
可能的 easy 解决方案将在表单后面的代码中实现IMessageFilter
接口。使用此PreFilterMessage
:
public bool PreFilterMessage(ref Message m)
{
// Blocks all the messages relating to the left mouse button.
return (m.Msg >= 513 && m.Msg <= 515) ;
}
但是再一次,禁用并重新启用鼠标的左键单击不要清空鼠标缓冲区 ......
答案 0 :(得分:1)
问题是进程在同一个线程中运行,因此在进程开始运行之前,表单实际上并未被禁用。最简单的方法是使用Application.DoEvents()强制它在启动进程之前将所有内容设置为禁用,但更专业(也可能更安全)的方法是在另一个线程中运行耗时的进程。
注意:在我自己的编程中遇到另一个故障后,我发现你可能必须在再次启用所有内容之前运行Application.DoEvents() - 它会触发用户对禁用控件进行的任何点击,而不是等待完成的过程 - 启用控件 - 然后触发点击。
显然DoEvents很乱,我应该使用线程。