Powershell:通过 Register-ObjectEvent 注册的事件处理程序不会立即触发 - 仅在我的对话框关闭后

周杰伦

我有一个关于事件处理程序 ( Register-ObjectEvent) 的问题。这是我的代码:

Import-Module "$PSScriptRoot\Lib\Ookii.Dialogs.Winforms.dll"

$OKButton     = [Ookii.Dialogs.WinForms.TaskDialogButton]("Ok")
$NOButton     = [Ookii.Dialogs.WinForms.TaskDialogButton]("No")
$CancelButton = [Ookii.Dialogs.WinForms.TaskDialogButton]("Cancel")
$HelpButton   = [Ookii.Dialogs.WinForms.TaskDialogButton]("Help")

$OokieTaskDialog = New-Object Ookii.Dialogs.WinForms.TaskDialog
$OokieTaskDialog.Buttons.Add($OKButton)
$OokieTaskDialog.Buttons.Add($NOButton)
$OokieTaskDialog.Buttons.Add($CancelButton)
$OokieTaskDialog.Buttons.Add($HelpButton)

$OokieTaskDialog.MainInstruction      = "Main Instruction"
$OokieTaskDialog.Content              = "Eiusmod cupidatat amet officia ut cillum anim proident. Aliqua aliqua ullamco reprehenderit velit est eiusmod et aute."
$OokieTaskDialog.ExpandedInformation  = "Wozarlov, Marvin Houston, (870) 487-7980"
$OokieTaskDialog.Footer               = "This is the footer text <a href=`"https://www.google.com`">More Info</a>"
$OokieTaskDialog.FooterIcon           = [Ookii.Dialogs.WinForms.TaskDialogIcon]::Information
$OokieTaskDialog.EnableHyperlinks     = $true

Register-ObjectEvent -InputObject $OokieTaskDialog -EventName HyperlinkClicked -Action { Write-Host "Link Clicked" }

$OokieTaskDialog.WindowTitle              = "Window Title"
$OokieTaskDialog.Width                    = 300
$OokieTaskDialog.AllowDialogCancellation  = $true
$OokieTaskDialog.MainIcon                 = [Ookii.Dialogs.WinForms.TaskDialogIcon]::Warning

$Result = $OokieTaskDialog.ShowDialog((New-Object System.Windows.Forms.Form -Property @{TopMost = $true}))
$Result

具体来说:Register-ObjectEvent -InputObject $OokieTaskDialog -EventName HyperlinkClicked -Action { Write-Host "Link Clicked" }

事件处理程序有效,但仅在对话框关闭后显示结果(“单击链接”)。当满足触发条件时,如何让事件处理程序立即响应?

例如,如果我单击页脚中的超链接 10 次,然后单击 OK 按钮,控制台将打印"Link Clicked"10 次。

"Link Clicked"单击超链接时,我想立即打印。

如何注册立即触发的事件?我究竟做错了什么?

鼠尾草紫

ShowDialog运行在与通过创建的侦听器相同的线程上Register-ObjectEvent在对话框关闭之前,它不会处理任何内容。

要让脚本块直接处理 .NET 事件,请调用对象的 Add-Event() 方法。

$OokieTaskDialog.Add_HyperlinkClicked({ Write-Host "Link Clicked" })

附加参考:

这个mklement0很好的答案:How to add an Event Action handler in Powershell

摘抄

C# 以运算符 += 和 -= 的形式提供语法糖,用于附加和分离事件处理程序委托,它们看起来像赋值,但实际上被转换为 add_() 和 remove_() 方法调用。

PowerShell 没有为附加/删除事件处理程序提供这样的语法糖,因此必须直接调用这些方法。

iRon的这个非常完整的答案Powershell: Job Event Action with Form not executed

摘抄:

即使设置了多个线程,一个线程中也有两个不同的“侦听器”。当您的脚本准备好接收表单事件(使用 ShowDialog 或 DoEvents)时,它不能同时监听 .NET 事件。反之亦然

这两个答案本身都提供了更多的见解和参考链接。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章