为什么我无法在 PowerShell 中的事件处理程序中设置窗体的 DialogResult?



考虑此代码:

$Form = New-Object System.Windows.Forms.Form
$YesButton = New-Object System.Windows.Forms.Button
$YesButton.Text = "Yes"
$YesButton.Location = New-Object System.Drawing.Point( `
    (($Form.Width / 2) - ($YesButton.Width)), 25)
$YesButton.Add_Click({$Form.DialogResult=[System.Windows.Forms.DialogResult]::OK})
$NoButton = New-Object System.Windows.Forms.Button
$NoButton.Text = "No"
$NoButton.Location = New-Object System.Drawing.Point( `
    ($YesButton.Location.X + $YesButton.Width + 10), $YesButton.Location.Y)
$NoButton.Add_Click({$Form.DialogResult=[System.Windows.Forms.DialogResult]::Cancel})
$Form.Controls.Add($YesButton)
$Form.Controls.Add($NoButton)
$Timer = new-object System.Windows.Forms.Timer
$Timer.Add_Tick(
{
    $Form.DialogResult = [System.Windows.Forms.DialogResult]::None
    $Form.Close() 
})
$Timer.Interval = 3000
$Timer.start()
$Result = $Form.ShowDialog()
if ($Result -eq "OK")
{
    Write-Output "User selected 'Yes'."
}
elseif ($Result -eq "Cancel")
{
    Write-Output "User selected 'No'."
}
elseif ($Result -eq "None")
{
    Write-Output "User selected nothing; prompt timed out."
}

如果我运行它并让计时器勾选表单,我会期望 它可以击中elseif ($Result -eq "None")并因此打印User selected nothing; prompt timed out.,但是它正在击中elseif ($Result -eq "Cancel")并打印User selected 'No'.

为什么要这样做,我该如何返回我想要的对话结果?

如果计时器关闭表单,则将拨号程序更改为none,但是$ form.close((在此后立即调用。

由于Close((方法更改了Dialogresult以取消,因此将Close((方法切换在您手动更改dialogresult的位置并更改该新的枚举值以使有条件按预期工作。

如果这是您想要的全部,我会保持简单,并考虑使用旧的时尚 WScript.Shell Popup

$Result = (New-Object -ComObject WScript.Shell).Popup("Do you like to continue?", 3, "Title", (1 + 32 + 4096))

最新更新