自从您的问题出现一年后,这可能就是答案。
我有同样的问题。我的应用程序有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