正在清除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) ;
}
但是,再次禁用并重新启用鼠标的左键单击不会清空鼠标缓冲区。。。
问题是进程在同一个线程中运行,因此在进程开始运行之前,表单实际上不会被禁用。简单的方法是使用Application.DoEvents()强制它在启动进程之前将所有内容设置为禁用,但更专业(可能更安全)的方法是在另一个线程中运行耗时的进程。
注意:在我自己的编程中遇到另一个问题后,我发现在再次启用一切之前,你可能必须运行Application.DoEvents()——它会触发用户在禁用的控件上进行的任何单击,而不是等待进程完成——启用控件——然后点击。
显然DoEvents很混乱,我应该使用线程。