自從您的問題出現一年後,這可能就是答案。
我有同樣的問題。我的應用程序有MinimizeBox = False,這將在窗體的右上角顯示一個小的Ok,並且是處理關閉事件的唯一方法(Cross with MinimizeBox = True不會引發ClosingEvent)。在這個事件中,我取消了關閉並執行了一些自定義代碼,並最小化了表單,使其看起來像標準的「交叉關閉事件」行爲。
問題是,在HTC鑽石上,當你殺了一個任務,它引發了同樣的關閉事件,我的代碼再次取消它。奇怪的是,在任務管理器中,應用程序已經消失,但是如果啓動原始的Microsoft任務管理器(/windows/taskmgr.exe),並在菜單中選擇顯示進程,則會看到您的應用程序仍在運行。這就是爲什麼你不能再次啓動它。奇怪的是,在HD2上它與關閉事件具有相同的行爲,但它似乎也強制在應用程序上進行暴力破解,所以沒有問題。
解決方案: 您只需要一個小布爾來知道您的應用程序是在前景還是背景上,您在表單中激活事件時設置爲true,在停用事件時設爲false。在關閉事件中,只有當您的應用程序處於前景時您纔會取消,您可以運行您的特殊代碼,否則讓表單關閉,這是一個殺手!
[DllImport("coredll.dll")]
static extern int ShowWindow(IntPtr hWnd, int nCmdShow);
const int SW_MINIMIZED = 6;
public static void MinimizeForm(IntPtr pFormHandle)
{
ShowWindow(pFormHandle,SW_MINIMIZED);
}
private bool m_IsFormVisible = false;
void m_MainForm_Deactivate(object sender, EventArgs e)
{
m_IsFormVisible = false;
}
void m_MainForm_Activated(object sender, EventArgs e)
{
m_IsFormVisible = true;
}
void m_MainForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (m_IsFormVisible)//very important !
{
e.Cancel = true;
//do something if you want
//minimize the form yourself
MinimizeForm(s_Instance.m_MainForm.Handle);
}
}
謝謝,這使我走上了正軌。我認爲我解決了線程問題..但在類似的問題上:如果我的主窗體產生一個ShowDialog(),我們在這一點通過TaskManager關閉應用程序;我們調用子窗體上的Closing事件。現在,如果我不告訴孩子關閉應用程序的其餘部分,我會回到原來的錯誤。另一方面,運行Aplication.Exit()意味着應用程序將始終退出(即使我想要做的就是關閉子窗體)。這兩個解決方案對我來說似乎都很愚蠢 - 我的孩子表單如何知道Close事件來自TaskManager或點擊右上角的「OK」 – pithyless 2010-03-17 14:56:49
顯然現在我的治療比疾病(對於兒童形式)更加致命。而且,這是HTC Diamond的問題;宏達HD2的作品很好。我不知道該如何解決這個問題。 – pithyless 2010-03-17 14:57:53