Powershell:通过 Register-ObjectEvent 注册的事件处理程序不会立即触发 - 只有在我的对话框关闭后
Powershell: Event handlers registered via Register-ObjectEvent don't fire immediately - only after my dialog closes
我有一个关于事件处理程序的问题 (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" }
事件处理程序有效,但它仅在对话框关闭后显示结果(“Link 已单击”)。如何让事件处理程序在满足触发条件时立即响应?
例如,如果我单击页脚中的超链接 10 次,然后单击确定按钮,控制台将打印 "Link Clicked"
10 次。
我想在单击超链接时立即打印 "Link Clicked"
。
如何注册一个立即触发的事件?我做错了什么?
ShowDialog
运行 与通过 Register-ObjectEvent
创建的侦听器在同一线程上。在对话框关闭之前,它不会处理任何内容。
要让脚本块直接处理 .NET 事件,请调用对象的 Add-Event() 方法。
$OokieTaskDialog.Add_HyperlinkClicked({ Write-Host "Link Clicked" })
其他参考:
这个mklement0 excellent answer:
节选
C# offers syntactic sugar in the form of operators += and -= for
attaching and detaching event-handler delegates, which look like
assignments, but are in reality translated to add_() and
remove_() method calls.
PowerShell offers no such syntactic sugar for attaching/removing event
handlers, so the methods must be called directly.
这个非常完整的答案来自 iRon: Powershell: Job Event Action with Form not executed
摘录:
Even if there are
multiple threads setup, there are two different 'listeners' in one
thread. When your script is ready to receive form events (using
ShowDialog or DoEvents) it can’t listen to .NET events at the same
time. And visa versa
这两个答案本身都提供了更多的见解和参考链接。
我有一个关于事件处理程序的问题 (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" }
事件处理程序有效,但它仅在对话框关闭后显示结果(“Link 已单击”)。如何让事件处理程序在满足触发条件时立即响应?
例如,如果我单击页脚中的超链接 10 次,然后单击确定按钮,控制台将打印 "Link Clicked"
10 次。
我想在单击超链接时立即打印 "Link Clicked"
。
如何注册一个立即触发的事件?我做错了什么?
ShowDialog
运行 与通过 Register-ObjectEvent
创建的侦听器在同一线程上。在对话框关闭之前,它不会处理任何内容。
要让脚本块直接处理 .NET 事件,请调用对象的 Add-Event() 方法。
$OokieTaskDialog.Add_HyperlinkClicked({ Write-Host "Link Clicked" })
其他参考:
这个mklement0 excellent answer:
节选
C# offers syntactic sugar in the form of operators += and -= for attaching and detaching event-handler delegates, which look like assignments, but are in reality translated to add_() and remove_() method calls.
PowerShell offers no such syntactic sugar for attaching/removing event handlers, so the methods must be called directly.
这个非常完整的答案来自 iRon: Powershell: Job Event Action with Form not executed
摘录:
Even if there are multiple threads setup, there are two different 'listeners' in one thread. When your script is ready to receive form events (using ShowDialog or DoEvents) it can’t listen to .NET events at the same time. And visa versa
这两个答案本身都提供了更多的见解和参考链接。