如何在不使用system()函数的情况下用C语言关闭Windows电脑?
不调用
system()实现Windows关机的C语言方案 要实现不依赖system()的Windows关机功能,直接调用Windows原生API是最优选择——相比启动cmd.exe执行shutdown命令,API调用效率更高、可靠性更强,还不会受系统命令行环境的影响。
核心思路
Windows系统提供了专门的关机API,比如InitiateSystemShutdownExW,但使用前需要先获取SE_SHUTDOWN_NAME权限(普通进程默认没有该权限)。
完整代码示例
#include <Windows.h> #include <stdio.h> BOOL EnableShutdownPrivilege() { HANDLE hToken; TOKEN_PRIVILEGES tp; // 打开当前进程的访问令牌 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { printf("OpenProcessToken failed, error: %lu\n", GetLastError()); return FALSE; } // 获取关机权限的LUID标识 if (!LookupPrivilegeValueW(NULL, SE_SHUTDOWN_NAME, &tp.Privileges[0].Luid)) { printf("LookupPrivilegeValue failed, error: %lu\n", GetLastError()); CloseHandle(hToken); return FALSE; } tp.PrivilegeCount = 1; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // 启用关机权限 if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) { printf("AdjustTokenPrivileges failed, error: %lu\n", GetLastError()); CloseHandle(hToken); return FALSE; } CloseHandle(hToken); return TRUE; } int main() { // 先启用关机权限,没有权限会导致关机失败 if (!EnableShutdownPrivilege()) { return 1; } // 调用API执行关机操作 // 参数说明: // 1. NULL: 操作本地计算机 // 2. NULL: 不向用户显示提示消息 // 3. 1: 延迟1秒后关机 // 4. TRUE: 强制关闭所有未保存数据的应用程序 // 5. TRUE: 关机后切断电源 // 6. 关机原因标记:这里设为计划内的系统操作原因 if (!InitiateSystemShutdownExW(NULL, NULL, 1, TRUE, TRUE, SHTDN_REASON_MAJOR_OPERATINGSYSTEM | SHTDN_REASON_MINOR_UPGRADE | SHTDN_REASON_FLAG_PLANNED)) { printf("InitiateSystemShutdownEx failed, error: %lu\n", GetLastError()); return 1; } printf("Shutdown initiated successfully.\n"); return 0; }
代码说明
EnableShutdownPrivilege函数:负责获取并启用关机所需的系统权限,这是关机操作的必要前提,否则API调用会失败。InitiateSystemShutdownExW:Windows官方提供的系统关机API,支持自定义延迟时间、是否强制关闭应用、关机后是否断电等参数,功能比system("shutdown -s -t1")更灵活可控。
内容的提问来源于stack exchange,提问作者Abdallah
相关产品推荐
相关产品推荐

