あなたの質問から1年が経ちましたが、これが答えかもしれません。
私は同じ種類の問題を抱えていました。私のアプリには MinimizeBox = False があります。これはフォームの右上隅に小さな OK を示し、Closing Event を処理する唯一の方法です (MinimizeBox = True の Cross は 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);
}
}