使用Win32 API获取Windows屏幕保护程序超时

时间:2018-08-16 13:47:02

标签: c++ winapi

我想在Windows上创建一个简单的C ++应用程序,以检查显示器的关闭时间。

经过一些搜索,我使用windows.h找到了此功能

int time;
bool check;
check = SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0, &time, 0);
if (check) {
    cout << "The Screen Saver time is : " << time << endl;
}
else {
    cout << "Sorry dude the windows api can't do it" << endl;
}

但是当我使用此代码时,时间始终为零,在我的窗口设置中,我将窗口设置为在5分钟后关闭显示。

我自己尝试了一些解决方案,将时间类型更改为long long,并且我得到了一个非常大的垃圾数字,所以我弄错了让屏幕关闭时间。

操作系统:Windows 10

编译器:Mingw32和我使用MSVC 2015测试

1 个答案:

答案 0 :(得分:5)

SPI_GETSCREENSAVETIMEOUT是过时的API(可惜Microsoft从未提及过)。屏幕保护程序超时现在是电源配置文件的一部分,并且可能会有所不同,例如电池还是交流电。

使用CallNtPowerInformation获取屏幕保护程序超时:

#include <iostream>
#include <windows.h>
#include <powerbase.h>

#pragma comment(lib, "PowrProf.lib")

int main() {
    SYSTEM_POWER_POLICY powerPolicy;
    DWORD ret;

    ret = CallNtPowerInformation(SystemPowerPolicyCurrent, nullptr, 0, &powerPolicy, sizeof(SYSTEM_POWER_POLICY));

    if (ret == ERROR_SUCCESS) {
        std::cout << "The Screen Saver time is : " << powerPolicy.VideoTimeout << std::endl;
    }
    else {
        std::cerr << "Error 0x" << std::hex << ret << std::endl;
    }

}

输出:

The Screen Saver time is : 600