2016-01-21 68 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 ; 
} 

我使用空格時可能的和分號給我帶來更多的清晰。