2011-06-06 104 views
1

我正在開發C#應用程序,當用戶單擊X時,應用程序在托盤圖標內最小化。像這樣:無法關閉C#應用程序

private void frmChat_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    e.Cancel = true; 
    Hide(); 
} 

該應用程序非常簡單(只有一種形式)。問題是我無法正常關閉應用程序。當用戶權限點擊托盤圖標並且他選擇「退出」時,他應該能夠關閉應用程序。問題是,即使托盤圖標被卸載並且表單已關閉,應用程序仍將在Task Manager中顯示爲活動應用程序。我正在關閉這樣的應用程序:

private void chiudiToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    trayIcon.Dispose(); 
    this.Close(); 
    Application.Exit(); 
} 

我在這裏錯過了什麼?

+1

你爲什麼要調用'this.Close'? – leppie 2011-06-06 10:35:58

+1

記住一些用戶討厭這個功能。他們點擊X,他們只想要關閉應用程序。好老的Live Messenger !!! – Andez 2011-06-06 10:48:42

回答

5

我之前做過類似的事情。

您需要知道什麼導致窗體關閉。所以當你點擊X時,傳遞給FormClosing事件的具體原因就是這樣。像這樣:

private void MyForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    // don't close just yet if we click on x 
    if (e.CloseReason == CloseReason.UserClosing) 
    { 
     e.Cancel = true; 
     this.Hide(); 
    } 
} 

另外,我從上下文菜單中點擊退出其他代碼:

private void tsmiExit_Click(object sender, EventArgs e) 
{ 
    // close the application forefully 
    TerminateApplication(); 
} 

/// <summary> 
/// Closes the Application. 
/// </summary> 
private void TerminateApplication() 
{ 
    // need to forcefully dispose of notification icon 
    this.notifyIcon1.Dispose(); 

    // and exit the application 
    Application.Exit(); 
} 

編輯:

注意:當您單擊X按鈕,關閉原因將是一個CloseReason.UserClosing。當調用Application.Exit時,再次使用CloseReason.ApplicationExitCall調用FormClosing。

末編輯:

希望這有助於

Andez

+0

哇,不知道你可以檢查密切的原因!謝謝 – 0plus1 2011-06-06 10:49:41

+0

+1這是一個非常好的解決方案,它利用了內置的'CloseReason' – 2011-06-06 10:51:10

1

Ciao,如果將Application.Exit替換爲Application.ExitThread,它會如何工作?

我其實怕你的代碼,當你調用this.Close你做了前面的方法上面的取消...

0

這是對Application.Exit()文檔就派上用場了(我粗體強調):

的退出方法停止所有正在運行的 消息循環上的所有線程和 關閉應用程序的所有窗口。 此方法不一定強制應用程序退出。 退出方法通常在消息循環中從 調用,並強制運行 以返回。要退出當前線程 的消息循環,請致電 ExitThread

0

您可以撥打Environment.Exit(0)其中參數是退出代碼。

0

當你調用「this.Close」它將調用「frmChat_FormClosing」,並且你正在設置「e.Cancel = true」這是創建問題,使用一些變量來確定從哪裏關閉事件相應地調用並設置e.Cancel。

2

e.Cancel = truefrmChat_FormClosing從關閉阻塞的應用程序。

您可以通過向您的表單類添加一個布爾字段(名稱爲TerminatingApp)來輕鬆解決此問題。在調用this.Close()之前將其設置爲true。在frmChat_FormClosing的內部,檢查TerminatingApp的值,如果TerminatingApp爲假,則只設置e.Cancel = true

事情是這樣的:

private void frmChat_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (!TerminatingApp) 
    { 
     e.Cancel = true; 
     Hide(); 
    } 
} 

private void chiudiToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    TerminatingApp = true; 
    trayIcon.Dispose(); 
    this.Close(); 
    Application.Exit(); 
} 
+0

你確實是對的,我忽略了這個!謝謝 – 0plus1 2011-06-06 10:47:46

0

我已經試過Environment.Exit(0)。它適用於這種情況,它對我來說工作得很好。