通過 Process.Start() 啟動第三方播放器(如 CBox),播放器全屏播放時,嘗試用 PostMessage(WM_CLOSE) 關閉,雖然窗口消失,但任務管理器中進程仍殘留。
WM_CLOSE 只是請求窗口關閉,應用程序可選擇忽略、最小化到托盤或僅隱藏主窗口而保持後台進程運行。PostMessage 是異步投遞,無法保證進程退出。
// 類級別字段
private Process _externalProcess;
// 啟動時
_externalProcess = new Process();
_externalProcess.StartInfo.FileName = @"C:\Program Files\CNTV\CBox\CBox.exe";
_externalProcess.Start();
// 關閉時
if (_externalProcess != null && !_externalProcess.HasExited)
{
_externalProcess.Kill(); // 強制終止進程及所有子進程
_externalProcess.WaitForExit(1000); // 可選等待
}
if (_externalProcess != null && !_externalProcess.HasExited)
{
// 1. 嘗試優雅關閉主窗口
_externalProcess.CloseMainWindow(); // 發送 WM_CLOSE 到主窗口
if (!_externalProcess.WaitForExit(3000)) // 等待 3 秒
{
// 2. 超時則強制殺掉
_externalProcess.Kill();
}
}
Process.Kill() 會立即終止進程,可能導致數據丟失(如未保存的播放進度),優先嘗試 CloseMainWindow()。Kill() 只能殺掉啟動的那個進程,需配合 Process.GetProcessesByName 批量清理。Process 實例作為類字段保存,避免局部變量被 GC 導致無法後續控制。