实现windows锁屏,待机,重启,关机

实现windows锁屏,待机,重启,关机

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

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×