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

标签 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 测试

最佳答案

屏保超时显示关机超时是两个不同的东西。

SPI_GETSCREENSAVETIMEOUT 返回屏幕保护程序超时 - Screen Saver 之后的时间被激活。如果从未配置屏幕保护程序,则值为 0。

显示关机超时 是屏幕电源被切断之前的时间,并且是电源配置文件的一部分(并且可以不同,例如电池与交流电源)。

使用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(powerPolicy));

    if (ret == ERROR_SUCCESS) {
        std::cout << "Display power-off timeout : " << powerPolicy.VideoTimeout << "s \n";
    }
    else {
        std::cerr << "Error 0x" << std::hex << ret << std::endl;
    }

}

示例输出:

Display power-off timeout : 600 s

关于c++ - 使用 Win32 API 获取 Windows 屏幕保护程序超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51878637/

相关文章:

c++ - sd_journal_send 发送二进制数据。如何使用 journalctl 检索数据?

c++ - 如何解决有关使用 FARPROC 调用 GetProcAddress 的 C4191 警告?

windows - 使用 WPP 跟踪到多个 ETW 提供程序

windows - 如何防止使用 GetTempFileName 创建的文件在重启时被自动删除

c++ - 在 Visual Studio 的解决方案资源管理器中组织项目文件

c++ - 试图初始化结构的构造函数中的初始化列表

c++ - 如何在自定义类的 map 中使用 emplace?

c++ - 编译时的 std::experimental::source_location

c++ - 更改通过钩子(Hook)的击键(c/c++)

winapi - Win32中有双击右键之类的东西吗?