最近项目中要用到通过远程下发指令实现对操作系统的锁屏,待机,重启和关机功能。
查了下windows的系统api,做了个demo来实现这些功能,带UI,使用的vs2017+Qt(能用Qt就不要用MFC了),国际惯例记录下。
锁屏
比较简单直接调提供API即可
void Controller::LockScreen(){ LockWorkStation();}
待机
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);}
重启
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);}
关机
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界面如下: