【问题标题】:C++ - Checking if Internet time is enabled in Win10C++ - 检查是否在 Win10 中启用了 Internet 时间
【发布时间】:2021-10-01 09:57:43
【问题描述】:

如何检查 C++ 代码是否启用了 Internet 日期和时间设置:

控制面板>“日期和时间”>“设置时间和日期”>“互联网时间”>“更改设置...”

此设置:

【问题讨论】:

  • 我不确定是否有 API 可以直接执行此操作,但您始终可以通过注册表执行此操作向下滚动一点here,他们会引导您完成它

标签: c++ datetime settings


【解决方案1】:

这是通过 WinAPI 和注册表的检查方法之一。

我们将寻找HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 值(查看https://techlibrary.hpe.com/docs/otlink-wo/How-to-Configure-a-Local-NTP-Server.html 了解更多信息)。 我们正在寻找一个Enabled 值。

所以,这里有一些未优化的代码并进行了一些检查(希望它有效...):

#include <iostream>
#include <Windows.h>

bool is_ntp_enabled(void)
{
    HKEY key;
    const auto sub_key{ TEXT("SYSTEM\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\NtpServer") };
    if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, sub_key, NULL, KEY_QUERY_VALUE, &key)) {
        std::cerr << "No registry access" << std::endl;
        return false;
    }

    DWORD buff;
    const DWORD buff_type{ KEY_READ };
    const DWORD buff_size{ sizeof(buff) };

    if (ERROR_SUCCESS != RegQueryValueEx(key, TEXT("Enabled"), NULL, (LPDWORD)&buff_type, (LPBYTE)&buff, (LPDWORD)&buff_size)) {
        std::cerr << "No registry value access" << std::endl;
        return false;
    }

    if (buff == 0)
        return false;
    else
        return true;
}

int main()
{
    std::cout << is_ntp_enabled() << std::endl;
}

【讨论】:

  • 我需要它在没有任何设置或任何东西的情况下工作,例如用户在他/她的个人计算机上使用该程序。您认为有一种方法可以在考虑到这一要求的情况下对其进行编码吗?
  • 我不太了解您的程序的目标。它应该检查时间设置,如果启用了 NTP,那么它会打开它吗?提供的检查代码(功能)将在任何安装了 Windows 的计算机上工作。如果您愿意,您还可以通过WinAPI 更改注册表参数(但这可能很复杂;可能更改一个注册表参数不会启用 NTP 和更新时钟)。但我以前没有这样做,所以我只能祝你好运.. :c
  • 这只是程序的一部分。它用于确保用户的时间设置正确,并且他/她没有尝试使用试用版。
猜你喜欢
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多