正在清除C#中的鼠标缓冲区

本文关键字:鼠标 缓冲区 清除 | 更新日期: 2023-09-27 18:25:39

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

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

正在清除C#中的鼠标缓冲区

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

注意:在我自己的编程中遇到另一个问题后,我发现在再次启用一切之前,你可能必须运行Application.DoEvents()——它会触发用户在禁用的控件上进行的任何单击,而不是等待进程完成——启用控件——然后点击。

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