实现休眠/睡眠,调用进程必须具有 SE_SHUTDOWN_NAME 特权
获取特权
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
if(::OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
{
::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函数实现睡眠/休眠
BOOL SetSystemPowerState(
[in] BOOL fSuspend,
[in] BOOL fForce
);
参数
[in] fSuspend
如果此参数为 TRUE,系统会挂起。 如果参数为 FALSE,则系统休眠。
[in] fForce
此参数不起作用。
返回值
如果电源已挂起并随后还原,则返回值为非零值。
如果系统未挂起,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
头文件:winbase.h (包括 Windows.h)
Library: Kernel32.lib
DLL: Kernel32.dll
#include <winbase.h>
#pragma comment(lib, "Kernel32.lib")
为 Windows Vista 和更高版本编写的应用程序应改用 SetSuspendState
BOOLEAN SetSuspendState(
[in] BOOLEAN bHibernate,
[in] BOOLEAN bForce,
[in] BOOLEAN bWakeupEventsDisabled
);
参数
[in] bHibernate
如果此参数为 TRUE,则系统休眠。 如果参数为 FALSE,系统会挂起。
[in] bForce
此参数不起作用。
[in] bWakeupEventsDisabled
如果此参数为 TRUE,系统将禁用所有唤醒事件。 如果参数为 FALSE,则保持启用任何系统唤醒事件。
返回值
如果该函数成功,则返回值为非零值。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError
头文件: powrprof.h
Library: PowrProf.lib
DLL: PowrProf.dll
#include "powrprof.h"
#pragma comment(lib, "PowrProf.lib")
锁定屏幕
BOOL LockWorkStation();
返回值
如果该函数成功,则返回值为非零值。 由于函数异步执行,因此非零返回值指示操作已启动。 它不指示工作站是否已成功锁定。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
最低受支持的客户端 Windows XP [桌面应用|UWP 应用]
最低受支持的服务器 Windows Server 2003 [桌面应用|UWP 应用]
目标平台 Windows
标头 winuser.h (包括 Windows.h)
Library User32.lib
DLL User32.dll
API 集 ext-ms-win-ntuser-misc-l1-5-1 (在 Windows 10 版本 10.0.14393)
代码示例
#include <windows.h>
#include <stdio.h>
#pragma comment( lib, "user32.lib" )
void main()
{
// Lock the workstation.
if( !LockWorkStation() )
printf ("LockWorkStation failed with %d\n", GetLastError());
}
关闭屏幕
PostMessage(HWND_BROADCAST,WM_SYSCOMMAND,SC_MONITORPOWER,2);
或者
::SendMessage(::GetDesktopWindow(),WM_SYSCOMMAND,SC_MONITORPOWER,2);