VCpp实现电脑睡眠_休眠_锁定_关闭屏幕

⌚Time: 2022-10-15 13:26:27

👨‍💻Author: Jack Ge

实现休眠/睡眠,调用进程必须具有 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);