我有一个监视脚本(带有winforms gui),它总是在后面运行。 不幸的是,当用户试图手动关闭计算机时,这会让用户感到恼火,因为它会引发" 此应用阻止Windows关闭" -screen。
所以我需要一种可靠的方式来在启动关闭时自动关闭脚本。
我尝试订阅SessionEnding - 和SessionEnded事件,但它不起作用:
$sysevent = [microsoft.win32.systemevents]
Register-ObjectEvent -InputObject $sysevent -EventName "SessionEnding" -Action { Exitfunction }
更新: 就像这样:
$sysevent = [microsoft.win32.systemevents]
Register-ObjectEvent -InputObject $sysevent -EventName "SessionEnding" -Action { [Windows.Forms.MessageBox]::Show("Shutdown!", "", [Windows.Forms.MessageBoxButtons]::OK, [Windows.Forms.MessageBoxIcon]::Warning)}
Register-ObjectEvent -InputObject $sysevent -EventName "SessionEnded" -Action { [Windows.Forms.MessageBox]::Show("Shutdown!", "", [Windows.Forms.MessageBoxButtons]::OK, [Windows.Forms.MessageBoxIcon]::Warning)}
Register-WmiEvent -Class win32_computerShutdownEvent -Action { [Windows.Forms.MessageBox]::Show("Shutdown!", "", [Windows.Forms.MessageBoxButtons]::OK, [Windows.Forms.MessageBoxIcon]::Warning)}
我添加了一个消息框,看看其中一个事件是否实际上会触发,但是动作脚本块执行的代码可能有问题。没运气。 当我尝试关闭Windows 8.1系统时,这些事件都没有发生。 当我用get-job读取它们时,事件中有无错误。国家在所有人中并没有开始"。
任何想法为什么?
答案 0 :(得分:2)
确定解决方案是:如果启动了关闭,Windows会向所有应用程序发送WM_QUIT消息。如果您订阅onClosing
- 事件,则可以查询$eventargs
是否已触发该事件。它包含CloseReason
- 属性,如果它是WindowsShutdown
,则可用于启动正确的清理并关闭应用程序。
有关如何执行此操作的详细信息,请参阅此post的答案。
答案 1 :(得分:2)
以下代码不是您完整问题的答案,但它取决于您的标题问题,并且可能会帮助那些只想停止关机的人:
If ( [ System.Environment ]:: HasShutdownStarted ) {
& "$env:SystemRoot\System32\Shutdown.exe" -a ;
}
我尽可能使用空格和分号给我带来更多的清晰度。
答案 2 :(得分:0)
http://blogs.technet.com/b/heyscriptingguy/archive/2010/04/15/hey-scripting-guy-april-15-2010.aspx
他用wmi来观看比赛 Register-WmiEvent -Class win32_computerShutdownEvent