你的问题已经过去一年了,但这可能是答案。
我有同样的问题。我的应用程序有 MinimizeBox = False,这会在表单的右上角显示一个小 Ok,并且是处理关闭事件的唯一方法(带有 MinimizeBox = True 的十字不会引发 ClosingEvent)。在这种情况下,我取消关闭并执行一些自定义代码并最小化表单,使其看起来像标准的“交叉关闭事物”行为。
问题是,在 htc diamond 上,当您杀死一个任务时,它会引发相同的关闭事件,而我的代码会再次取消它。奇怪的是,在任务管理器中该应用程序已经消失了,但是如果您启动原始的 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);
}
}