禁用按钮仍会触发Click事件

时间:2020-05-14 22:38:26

标签: forms powershell powershell-studio

我正努力防止用户快速垃圾邮件单击一个按钮,这将在多次执行代码时冻结应用程序几分钟。

$searchBtn_clicked = {
    $searchBtn.Enabled = $false

    ... some code that fills a listview from search result

    $searchBtn.Enabled = $true
}

我的问题是:无论如何,上面的代码将与单击按钮一样执行多次。单击后禁用按钮没有任何改变。我还尝试了在重新启用之前添加start-sleep 2

第一次单击将触发代码,随后的单击将显示在已禁用的按钮上……只要该按钮再次变为“启用”,仍将触发Click事件。

这是怎么回事?某种异步魔术?所有点击事件都以某种方式排队,并且仅在再次启用按钮后才能处理?

我是PowerShell的新手,非常困惑。

1 个答案:

答案 0 :(得分:3)

添加[System.Windows.Forms.Application]::DoEvents()

$searchBtn.Add_Click({
    $this.Enabled = $false

    # ... some code that fills a listview from search result

    # flush out all pending events
    [System.Windows.Forms.Application]::DoEvents() 
    $this.Enabled = $true
})

希望有帮助

Windows消息按顺序排队和处理。如果您的代码繁忙,这些消息(垃圾邮件点击)将存储在该队列中,并在可能时进行处理。 DoEvents()告诉窗口处理当前在消息队列中的所有消息,从而有效地刷新它。