我有一个关于事件处理程序 ( 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] 删除。
我来说两句