Прошел год с момента вашего вопроса, но это может быть ответом.
У меня была такая же проблема. Мое приложение имеет MinimizeBox = False, это показывает маленький Ok в правом верхнем углу формы и является единственным способом обработки события закрытия (крестик с MinimizeBox = True не вызывает ClosingEvent). В этом случае я отменяю закрытие и создаю некоторый пользовательский код и минимизирую форму, чтобы она выглядела как стандартное поведение «Перекрестная близость».
Проблема в том, что на htc diamond, когда вы убиваете задачу, она вызывает то же самое закрывающее событие, и мой код отменяет его снова. Странно то, что в диспетчере задач приложение исчезло, но если вы запустите исходный диспетчер задач Microsoft (/windows/taskmgr.exe) и в меню выберите «Показать процессы», вы увидите, что ваше приложение все еще работает. Вот почему вы не можете запустить его снова. Странно, но на HD2 он работает так же, как и с событием закрытия, но, похоже, также вызывает грубое уничтожение приложения, поэтому никаких проблем.
Решение:
Вам просто нужно немного bool, чтобы узнать, находится ли ваше приложение на переднем или на заднем плане, для которого вы установили значение 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);
}
}