關(guān)于 Windows 上使用 TerminateProcess 關(guān)閉 Explorer 后重啟的問題
首先, TerminateProcess 函數(shù)沒有特殊的用法, 無外乎以下處理:
HANDLE bExitCode = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
if (NULL != bExitCode) {
BOOL bFlag = TerminateProcess(bExitCode, 0);
CloseHandle(bExitCode);
}
但是這個時候, 如果我們關(guān)閉的是 Explorer 的時候, 會發(fā)現(xiàn) Explorer 會被系統(tǒng)自動重新加載.
Explorer 簡介
Explorer.EXE 作為 Windows Shell 的組件之一, 主要的用途包括有:
- 顯示桌面、任務(wù)欄
- 提供圖形化的文件操作方式(例如大家熟知的資源管理器)
- ……
總而言之, 沒有 Explorer.EXE 的 Windows 不是不能運作, 而是操作很不方便.
作為 Windows Shell 重要的一環(huán), Explorer.EXE 的啟動由注冊表鍵值(Windows 2000/XP/Server 2003):
鍵:HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Winlogon
鍵名:Shell
默認鍵值:Explorer.EXE
或配置文件 system.ini 決定(Windows 98/ME):
[Boot]
Shell=Explorer.EXE
Kill Explorer
經(jīng)過測試后我們發(fā)現(xiàn), 使用 TaskManager, Process Explorer 等工具 Kill Explorer 的時候, Explorer 并沒有自動重啟. 而且這兩個工具使用的都是 TerminateProcess() 函數(shù). 但是我們使用它的時候就沒有產(chǎn)生效果. 無論任務(wù)管理器還是 Process Explorer, 在傳入第 2 個參數(shù) uExitCode 的時候, 傳入的值總是1.
這時候我們參考這里, 把uExitCode的值設(shè)置為1, 然后去結(jié)束 Explorer.EXE,這時候, Explorer 沒有重啟.