在C#中清除鼠标缓冲区

时间:2013-07-30 10:31:40

标签: c# winforms caching mouseevent clicking

我在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) ;
}

但是再一次,禁用并重新启用鼠标的左键单击不要清空鼠标缓冲区 ......

1 个答案:

答案 0 :(得分:1)

问题是进程在同一个线程中运行,因此在进程开始运行之前,表单实际上并未被禁用。最简单的方法是使用Application.DoEvents()强制它在启动进程之前将所有内容设置为禁用,但更专业(也可能更安全)的方法是在另一个线程中运行耗时的进程。

注意:在我自己的编程中遇到另一个故障后,我发现你可能必须在再次启用所有内容之前运行Application.DoEvents() - 它会触发用户对禁用控件进行的任何点击,而不是等待完成的过程 - 启用控件 - 然后触发点击。

显然DoEvents很乱,我应该使用线程。