最近项目中要用到通过远程下发指令实现对操作系统的锁屏,待机,重启和关机功能。
查了下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界面如下: