gpt4 book ai didi

winforms - 让 PS 脚本等待 NotifyIcon 单击,然后显示消息框并退出

转载 作者:行者123 更新时间:2023-12-02 23:59:52 24 4
gpt4 key购买 nike

我有一种情况,我需要一个计划任务来运行脚本,检查某些证书是否即将到期,然后通知用户。我选择使用 Windows 窗体 NotifyIcon 对象,因为我可以弹出一个看起来集成到操作系统中的漂亮小气球。我希望它在用户单击图标时显示一个 MsgBox(好吧,我希望它在他们单击图标或气球时显示它,但现在我将解决该图标)。

问题是我无法让脚本等待用户单击图标,或者如果我设置了一个循环以使脚本等待我似乎无法让脚本在用户单击时退出循环图标。如果脚本在没有等待图标消失的情况下直接退出,则将气球随身携带,因此用户会在屏幕上看到图标和气球闪烁,并且在他们阅读或与之交互之前就消失了。这是一个显示该问题的简化版本(您需要将图标路径更改为系统上的有效 .ico 文件)。

[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")|Out-Null

Function Show-MsgBox ($Text,$Title="",[Windows.Forms.MessageBoxButtons]$Button = "OK",[Windows.Forms.MessageBoxIcon]$Icon="Information"){
[Windows.Forms.MessageBox]::Show("$Text", "$Title", [Windows.Forms.MessageBoxButtons]::$Button, $Icon) | ?{(!($_ -eq "OK"))}
}

#Create Notification Icon
$objNotifyIcon = New-Object System.Windows.Forms.NotifyIcon
$objNotifyIcon.BalloonTipIcon = "Info"
$objNotifyIcon.BalloonTipText = "Click Me!"
$objNotifyIcon.BalloonTipTitle = "I'm a title"
$objNotifyIcon.Text = "Click Me!"
$objNotifyIcon.Icon = "C:\temp\vsmartcard.ico"

$NotDone = $true
$objNotifyIcon.add_click({Show-MsgBox -text "User Clicked Icon"; $Global:NotDone = $false})
$objNotifyIcon.Visible = $true
$objNotifyIcon.ShowBalloonTip(10000)
While($NotDone){
"`$NotDone = $NotDone`nSleeping for 3 seconds"
Start-Sleep -Seconds 3
}

$objNotifyIcon.Visible = $False
$objNotifyIcon.Dispose()

奇怪的是,如果我点源它,这会按预期工作,但如果我只是运行脚本则不会。

我尝试注册事件而不是使用 add_click方法和使用 Wait-Event cmdlet,但它从不注册事件发生,它要么永远坐在那里等待事件,如果我包含超时,它会等待它过期,然后完成脚本并退出(在这种情况下,用户可能永远看不到我的如果他们在超时的 15 秒内没有注意到它,则通知)。我尝试使用的代码如下(多年前我在 Keith Hill 的 SO 答案中找到的代码的修改版本):
Register-ObjectEvent $objNotifyIcon BalloonTipClicked -SourceIdentifier event_BalloonTipClicked -Action {
Show-MsgBox -Text $Text -Title $Title
Unregister-Event -SourceIdentifier $event.SourceIdentifier -Force
Remove-Job $event.SourceIdentifier -Force
$objNotifyIcon.Visible = $False
}
Register-ObjectEvent $objNotifyIcon Click -SourceIdentifier event_Click -Action {
Show-MsgBox -Text $Text -Title $Title
Unregister-Event -SourceIdentifier $event.SourceIdentifier -Force
Remove-Job $event.SourceIdentifier -Force
$objNotifyIcon.Visible = $False
}

$objNotifyIcon.Visible = $True
$objNotifyIcon.ShowBalloonTip(10000)
wait-event

我试过包括 BreakExitClick事件脚本 block ,但他们只是抛出了错误。

最佳答案

while($Global:NotDone) { ... }

这样,它引用了事件中已经引用的同一个变量。

事实证明不相关的东西:

问题是,正如您所推测的那样,没有任何东西在等待事件。但是尝试添加循环是行不通的,因为你只有一个线程,现在它陷入了 sleep 和循环。

您可能需要为此使用事件,然后您需要等待事件,而不仅仅是 sleep 。

我找到了 a good example of this on powershell.com :
param 
(
$msg = "For the latest updates check our intranet website. Please click in the balloon.",
$title = "News",
$icon = "None",
$timeout=1
)

[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | out-null
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") | out-null

$Balloon = new-object System.Windows.Forms.NotifyIcon
$Balloon.Icon = [System.Drawing.SystemIcons]::Information
$Balloon.Visible = $true;
$Balloon.ShowBalloonTip($timeout, $title, $msg, $icon);

Unregister-Event -SourceIdentifier click_event -ErrorAction SilentlyContinue
Register-ObjectEvent $Balloon BalloonTipClicked -sourceIdentifier click_event -Action {

$ie = New-Object -com InternetExplorer.Application
$ie.navigate2("https://intranet.mydomain.com")
$ie.visible = $true

} | Out-Null

Wait-Event -timeout 15 -sourceIdentifier click_event > $null
Remove-Event click_event -ea SilentlyContinue
Unregister-Event -SourceIdentifier click_event -ErrorAction SilentlyContinue
$Balloon.Dispose()

它是 Wait-Event这里正在做适当的等待。

你说你对这种方法有问题。您也可以将该代码编辑到问题中吗?

关于winforms - 让 PS 脚本等待 NotifyIcon 单击,然后显示消息框并退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32593304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com