Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 电源按钮和盖睡眠定制_C++_Winapi_Sleep_Power Management - Fatal编程技术网

C++ 电源按钮和盖睡眠定制

C++ 电源按钮和盖睡眠定制,c++,winapi,sleep,power-management,C++,Winapi,Sleep,Power Management,据我所知,Windows控制面板中只有睡眠/休眠和关机选项,以响应电源按钮和笔记本电脑盖的关闭: 我写了一个Windows服务,我很好奇是否可以自定义这些选项?首先,我需要能够在将系统发送到睡眠状态之前注销Windows用户。只是,我想提供一些有关系统空闲时间和注销的线索 您可以使用boolwinapi GetLastInputInfo获取系统空闲时间( _外塑性输入 ); 这是一种获取系统空闲时间的简单方法 LASTINPUTINFO input_info; input_info.cbSi

据我所知,Windows控制面板中只有睡眠/休眠和关机选项,以响应电源按钮和笔记本电脑盖的关闭:


我写了一个Windows服务,我很好奇是否可以自定义这些选项?首先,我需要能够在将系统发送到睡眠状态之前注销Windows用户。

只是,我想提供一些有关系统空闲时间注销的线索

您可以使用
boolwinapi GetLastInputInfo获取系统空闲时间(
_外塑性输入
);
这是一种获取系统空闲时间的简单方法

LASTINPUTINFO input_info;
input_info.cbSize = sizeof(LASTINPUTINFO);

::GetLastInputInfo(&input_info);

 //input_info.dwTime` means the value of tick count 
 //when the last input event was received. 

 //So, you can get idle time by using below code.
 DWORD currentTime = GetTickCount();
 DWORD timeElapsed = currentTime - input_info.dwTime;
接下来,据我所知,
ExitWindowsEx()
函数可用于注销、关闭系统,并且当应用程序调用其中一个系统关闭函数时,会发送
WM\u QUERYENDSESSION


我希望这会对你有所帮助

好的,我必须回答我自己的问题。以下是我能够发现的:

当盖子关闭时,很容易得到将执行的动力动作。以下是代码(但必须从用户模式进程运行):

当盖子关闭时,设置电源操作也很容易(同样,代码必须在用户模式进程中运行——否则,您需要使用除
PowerGetActiveScheme
call以外的方法获取电源方案GUID):

这也适用于电源/睡眠按钮操作。
GUID\u SYSTEM\u BUTTON\u子组中的GUID如下所示:

GUID_POWERBUTTON_ACTION = power button
GUID_SLEEPBUTTON_ACTION = sleep button
GUID_USERINTERFACEBUTTON_ACTION = sometimes another OEM sleep button
不幸的是,我无法看到如何为这些事件设置自定义电源操作

BOOL setLidClosedAction(DWORD dwVal)
{
    //'dwVal' = can be one of:
    //          0 = do nothing
    //          1 = sleep
    //          2 = hibernate
    //          3 = shut-down
    BOOL bRes = FALSE;

    GUID* pGuidActivePwrSchm = NULL;
    DWORD dwR = PowerGetActiveScheme(NULL, &pGuidActivePwrSchm);
    if(dwR == ERROR_SUCCESS)
    {
        dwR = PowerWriteACValueIndex(NULL, pGuidActivePwrSchm, &GUID_SYSTEM_BUTTON_SUBGROUP, &GUID_LIDCLOSE_ACTION, dwVal);
        if(dwR == ERROR_SUCCESS)
        {
            bRes = TRUE;
        }
        else
        {
            _tprintf(L"PowerWriteACValueIndex error=%d\n", dwR);
        }

        if(pGuidActivePwrSchm)
        {
            LocalFree(pGuidActivePwrSchm);
            pGuidActivePwrSchm = NULL;
        }
    }
    else
    {
        _tprintf(L"PowerGetActiveScheme error=%d\n", dwR);
    }

    return bRes;
}
GUID_POWERBUTTON_ACTION = power button
GUID_SLEEPBUTTON_ACTION = sleep button
GUID_USERINTERFACEBUTTON_ACTION = sometimes another OEM sleep button