最近项目中要用到通过远程下发指令实现对操作系统的锁屏,待机,重启和关机功能。
查了下windows的系统api,做了个demo来实现这些功能,带UI,使用的vs2017+Qt(能用Qt就不要用MFC了),国际惯例记录下。
锁屏
比较简单直接调提供API即可
1 2 3 4
| void Controller::LockScreen() { LockWorkStation(); }
|
待机
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| void Controller::Standby() { HANDLE hToken; TOKEN_PRIVILEGES tp; LUID luid;
//获取当前进程token BOOL bRet = ::OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); if (bRet) { //查看系统权限的特权值 ::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luid); tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; //提升权限 ::AdjustTokenPrivileges(hToken, false, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL); } ::SetSystemPowerState(false, true); }
|
重启
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| void Controller::Restart() { HANDLE hToken; TOKEN_PRIVILEGES tp; LUID luid;
//获取当前进程token BOOL bRet = ::OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); if (bRet) { //查看系统权限的特权值 ::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luid); tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//提升权限 ::AdjustTokenPrivileges(hToken, false, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL); }
::ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0); }
|
关机
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| void Controller::Shutdown() { HANDLE hToken; TOKEN_PRIVILEGES tp; LUID luid;
//获取当前进程token BOOL bRet = ::OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); if (bRet) { //查看系统权限的特权值 ::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luid); tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//提升权限 ::AdjustTokenPrivileges(hToken, false, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL); }
::ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE | EWX_POWEROFF, 0); }
|
UI界面如下:

