VC 之关机程序的问题

2019-07-14 02:23发布

  关机程序,运行之后在屏幕上显示“可以安全关闭电源”的字样,但是并未切断电源。
  因为旧版的电源不支持ATX,所以关机之后会出现那些字样。
解决方法一:
  把注册表中的[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWinlogon]下的PowerdownAfterShutdown键设置值为1即可。
解决方法二: HANDLE hToken; TOKEN_PRIVILEGES tkp; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; // one privilege to set tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); if(!ATX) ExitWindowsEx(EWX_SHUTDOWN| EWX_FORCE, 0); else ExitWindowsEx(EWX_POWEROFF| EWX_FORCE, 0); 说明:
  判断电源是否支持ATX的代码已省略
解决方法三:
  参考代码 BOOL fResult;TOKEN_PRIVILEGES tkp;HANDLE hToken; if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { MessageBox( "OpenProcessToken failed! "); return FALSE; } LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid); //获得本地机唯一的标识 tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0); //调整获得的权限 if (GetLastError() != ERROR_SUCCESS) { MessageBox( "AdjustTokenPrivileges enable failed! "); return FALSE; } fResult =InitiateSystemShutdown( NULL, // 要关的计算机用户名 "由于系统不稳定,WINDOWS将在上面的时间内关机,请做好保存工作! ", // 显示的消息 10, // 关机所需的时间 TRUE, // ask user to close apps style); //设为TRUE为重起,设为FALSE为关机 if(!fResult) { MessageBox( "InitiateSystemShutdown failed. "); return FALSE; } tkp.Privileges[0].Attributes = 0; AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0); if (GetLastError() != ERROR_SUCCESS) { MessageBox( "AdjustTokenPrivileges disable failed. "); return FALSE; } if (style) { return ExitWindowsEx(EWX_REBOOT|EWX_FORCE|EWX_POWEROFF,0); } else { return ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE|EWX_POWEROFF,0); }