2

我试图防止用户快速点击一个按钮,这可能会在代码多次执行时冻结应用程序几分钟。

$searchBtn_clicked = {
    $searchBtn.Enabled = $false

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

    $searchBtn.Enabled = $true
}

我的问题是:无论如何,只要单击按钮,上面的代码就会执行多次。单击后禁用按钮不会改变任何内容。我还尝试start-sleep 2在启用它之前添加一个。

第一次点击触发代码,随后的点击是在禁用的按钮上......并且仍然会触发 Click 事件,只要按钮再次启用。

这里发生了什么?某种异步魔法?所有点击事件都以某种方式排队并且仅在按钮再次启用后才被处理?

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

4

1 回答 1

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()告诉窗口处理当前在消息队列中的所有消息,有效地刷新它。

于 2020-05-15T10:23:28.967 回答