現象:程式昨日正常,今日在 VS 中關閉主視窗時擲出 0xC0000008: An invalid handle was specified,堆疊指向 WndProc,且停止偵錯後進程殘留無法終止,需關閉 VS 才能清除。
在 FormClosing 或 WndProc 中呼叫 DestroyHandle() 或讓控制項提前釋放控制代碼,但訊息迴圈仍有未處理訊息(如 WM_NCDESTROY)試圖存取已銷毀的 Handle。常見於:
WndProc 未正確呼叫 base.WndProc(ref m)。FormClosing 強制 this.Handle = IntPtr.Zero 或呼叫 DestroyHandle()。FormClosing、FormClosed、Dispose(bool) 是否有異常程式碼。WndProc 覆寫處,確認所有訊息最終都呼叫 base.WndProc(ref m)。// 正確的 WndProc 模板
protected override void WndProc(ref Message m)
{
// 自訂訊息處理...
base.WndProc(ref m); // 必須呼叫,否則系統訊息無法正常處理
}
// FormClosing 正確範例
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
// 釋放自訂資源、取消訂閱事件
// 禁止:DestroyHandle(); 或 this.Handle = IntPtr.Zero;
}
偵錯時進程無法結束,通常是 Visual Studio 處理序附著 導致。解決:
WndProc 覆寫務必呼叫 base.WndProc。