当用户单击一个按钮时,它会启动一些任务。我不想阻塞主应用程序线程,所以我在一个单独的线程中运行它。现在我需要禁止用户单击按钮,直到我的任务完成。
我可以设置
button.Enabled = false;
,但我正在寻找一些方法来忽略点击它。
我可以在点击事件处理程序中添加一些检查:
if (executingThread != null) return;
,但我必须为每个处理程序都这样做,这是个坏主意。
我知道有一些方法可以过滤用户的消息。你能指点我怎么做吗?而且我不想过滤掉所有消息,因为其他一些按钮必须保持可点击状态,我需要过滤掉特定控件(按钮、网格等)的消息。
解决方案
internal class MessagesFilter: IMessageFilter
{
private readonly IntPtr ControlHandler;
private const int WM_KEYUP = 0x0101;
public MessagesFilter(IntPtr ControlHandler)
{
this.ControlHandler = ControlHandler;
}
#region IMessageFilter Members
public bool PreFilterMessage(ref Message m)
{
// TODO: Add MessagesFilter.PreFilterMessage implementation
if (m.Msg == WM_KEYUP)
{
if (m.HWnd == ControlHandler)
{
Keys k = ((Keys) ((int) m.WParam));
if (k == Keys.Enter)
return true;
}
}
return false;
}
#endregion
}