2016-01-21 66 views
3

嗨,我有一个始终运行在后面的监视脚本(带有winforms gui)。 不幸的是,当用户尝试手动关闭计算机时会引起用户“这个应用程序阻止Windows关机”屏幕。使用Powershell检测系统关机

所以我需要一个可靠方式来启动关机时自动关闭脚本。

我想订阅的SessionEnding - 和SessionEnded事件,但没有奏效:

$sysevent = [microsoft.win32.systemevents] 
Register-ObjectEvent -InputObject $sysevent -EventName "SessionEnding" -Action { Exitfunction } 

UPDATE

$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系统时,这些事件都不会发生在中。 有没有错误里面的事件,当我读取他们的工作。国家在所有这些“未开始”。

任何想法为什么?

+0

可能重复[Powershell窗口阻止关机](http://stackoverflow.com/questions/10174075/powershell-window-preventing-shutdown) –

+0

这就是我发布自己以上同样的解决方案。它不起作用,至少不是每次。不幸的是,我不能说为什么它不起作用,所以我正在寻找替代解决方案,如果有的话。 – Rob

+0

嗯,没有。不是。链接的帖子包含的代码明显多于您在此发布的代码,并且还包括注册第二个活动。你应该仔细阅读它。 (它也被接受,这通常意味着提出问题的用户找到了解决方案。) –

回答

1

确定的解决方案是:如果一个关机启动时,Windows发送WM_QUIT,消息对所有应用程序。如果您订阅了onClosing事件,则可以查询$eventargs该事件是否已被触发。它包含一个CloseReason属性,如果它是WindowsShutdown可用于启动正确的清理并关闭应用程序。 有关如何做到这一点的更多信息,请参阅此post的答案。

1

下面的代码是不是一个答案,完整的问题,但它是你的标题问题,可以帮助别人谁只想已经停止关机超时:

If ([ System.Environment ]:: HasShutdownStarted) { 
    & "$env:SystemRoot\System32\Shutdown.exe" -a ; 
} 

我使用空格时可能的和分号给我带来更多的清晰。