2013-07-18 44 views
3

我想我的應用程序可以防止從Windows關閉。我知道有一個系統命令來做到這一點。但不適用於我的程序。 我使用此代碼爲「取消」的窗口關閉:C#取消Windows關機

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason.Equals(CloseReason.WindowsShutDown)) 
    { 
     MessageBox.Show("Cancelling Windows shutdown"); 
     string cmd = "shutdown /a"; 
     Process.Start(cmd);// for executing system command. 
    } 
} 

,並使用此代碼,但沒有工作:(:

public Form1() 
{ 
    InitializeComponent(); 

    SystemEvents.SessionEnding += SessionEndingEvtHandler; 
} 

private void SessionEndingEvtHandler(object sender, SessionEndingEventArgs e) 
{ 
    MessageBox.Show("Cancelling Windows shutdown"); 
    string cmd = "shutdown /a"; 
    Process.Start(cmd);// for executing system command. 
} 

我將不勝感激,如果有人給我解釋一下怎麼樣可在「取消」窗口關閉。 感謝

+2

在Windows的現代版本,應用程序不能做到這一點,在Vista中引入IIRC –

+2

的變動情況說明如下:HTTP:// MSDN .microsoft.com/en-us/library/ms700677.aspx即使應用程序阻止關機,用戶也可以覆蓋該應用程序並強制它。 –

+0

'shutdown/a'只會取消關機前的超時時間(例如,如果您已通過'shutdown/t 30'啓動系統關機)。一旦關機過程本身已經開始,它就不能停止。 –

回答

-3
private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason.Equals(CloseReason.WindowsShutDown)) 
    { 
     MessageBox.Show("Cancelling Windows shutdown"); 
     e.Cancel = true; 
    } 
} 
13

這是強烈不明智和微軟使其很難,因爲有可能做到這一點。如果用戶想要關閉, n它是用戶的責任,而不是應用程序。按照微軟的文章Application Shutdown Changes in Windows Vista

靜音關機取消將不再被允許

在Windows XP中,應用程序被允許否決WM_QUERYENDSESSION 而不顯示說明爲什麼他們需要取消關機任何UI。 這些「無聲關機失敗」對用戶來說非常令人沮喪,因爲 沒有UI顯示,所以用戶通常需要一兩分鐘的時間才意識到關機失敗。

即使 應用程序否決WM_QUERYENDSESSION,Windows Vista將通過顯示UI來消除此可能性。

...也... ...

應用程序不應該阻止關機

如果你只需要一兩件事從閱讀這個話題了,它應該是 這一個。如果您的應用程序不阻止關機,您將向用戶展示最佳體驗。當用戶發起 關機時,在絕大多數情況下,他們都有強烈的願望,看到關機成功 ;例如,他們可能急於離開辦公室,例如週末的 。如果可能的話,應用程序應該遵守 不會阻止關機的要求。

如果你確實需要關閉期間intevene,有一個新的API,你應該與註冊:

使用新的關機原因API

新的關機原因API由三個功能組成:

BOOL ShutdownBlockReasonCreate(HWND hWnd, LPCWSTR pwszReason); 
BOOL ShutdownBlockReasonDestroy(HWND hWnd); 
BOOL ShutdownBlockReasonQuery(HWND hWnd, LPWSTR pwszBuff, DWORD *pcchBuff); 

此外,Windows Vista應用程序的最佳實踐關機時關機是 ,他們不應該阻止關機。但是,如果您的應用程序 必須阻止關閉,Microsoft建議您使用此API。

但在一天結束的時候,這一切都將做的是當前的用戶界面給用戶說,應用程序正在阻止關機並詢問用戶是否要繼續和強制關機。如果他們回答「是」,則無法阻止此操作,並且無法阻止用戶界面。

閱讀我已經鏈接到的MSDN文章 - 它從Vista開始探索模型。最終,這種範例是爲用戶提供控制,並防止應用程序壓倒用戶需求。

-3
private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason.Equals(CloseReason.WindowsShutDown)) 
    { 
     MessageBox.Show("Cancelling Windows shutdown"); 
     Process.Start("cmd.exe", "shutdown /a");// for executing system command. 
    } 
} 
-3

迴路關閉中止,工作在Windows 8

while (1==1) 
{ 
    Process process = new Process(); 
    process.StartInfo.FileName = "shutdown.exe"; 
    process.StartInfo.Arguments = "-a"; 
    process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    process.Start(); 
    process.WaitForExit(); 
    Thread.Sleep(2000); 


}