关于 Windows 上使用 TerminateProcess 关闭 Explorer 后重启的问题
首先, TerminateProcess 函数没有特殊的用法, 无外乎以下处理:
HANDLE bExitCode = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
if (NULL != bExitCode) {
BOOL bFlag = TerminateProcess(bExitCode, 0);
CloseHandle(bExitCode);
}
但是这个时候, 如果我们关闭的是 Explorer 的时候, 会发现 Explorer 会被系统自动重新加载.
Explorer 简介
Explorer.EXE 作为 Windows Shell 的组件之一, 主要的用途包括有:
- 显示桌面、任务栏
- 提供图形化的文件操作方式(例如大家熟知的资源管理器)
- ……
总而言之, 没有 Explorer.EXE 的 Windows 不是不能运作, 而是操作很不方便.
作为 Windows Shell 重要的一环, 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
经过测试后我们发现, 使用 TaskManager, Process Explorer 等工具 Kill Explorer 的时候, Explorer 并没有自动重启. 而且这两个工具使用的都是 TerminateProcess()
函数. 但是我们使用它的时候就没有产生效果. 无论任务管理器
还是 Process Explorer
, 在传入第 2 个参数 uExitCode
的时候, 传入的值总是1
.
这时候我们参考这里, 把uExitCode的值设置为1, 然后去结束 Explorer.EXE
,这时候, Explorer 没有重启.