c++ - 以编程方式获取 Windows 设置 |账户设置 |需要登录

标签 c++ api winapi wmi

尝试以编程方式获取 Windows 设置时遇到问题。我想检测用户是否有配置在 PC 从 sleep 中唤醒时需要登录。我只能从屏幕保护程序设置中获取信息,但在这种情况下还不够。
我用谷歌搜索了很多,但找不到任何解决方案,这可能吗?
谢谢
Screen Capture Require Sign In option

最佳答案

好的,经过长时间的搜索,我找到了您需要的答案,在PowerGetActiveScheme ()的帮助下和 PowerReadDCValueIndex ()
代码示例:(C#)

根据您的需要,您可以轻松转换为 C++。

using System;
using System.Runtime.InteropServices;

namespace PowrprofTest
{
    class Program
    {

        private static readonly Guid CONSOLELOCK = new Guid("0e796bdb-100d-47d6-a2d5-f7d2daa51f51");
        private static readonly Guid SUB_NONE = new Guid("fea3413e-7e05-4911-9a71-700331f1c294");

        [StructLayout(LayoutKind.Sequential)]
        public class GuidClass
        {
            public Guid Value;
        }

        [DllImport("powrprof.dll")]
        public static extern UInt32 PowerGetActiveScheme(
            IntPtr UserRootPowerKey,
            ref IntPtr ActivePolicyGuid
        );

        [DllImport("powrprof.dll", CharSet = CharSet.Unicode)]
        public static extern UInt32 PowerReadACValueIndex(
            IntPtr RootPowerKey,
            ref Guid SchemeGuid,
            ref Guid SubGroupOfPowerSettingsGuid,
            ref Guid PowerSettingGuid,
            ref UInt32 AcValueIndex
        );

        [DllImport("powrprof.dll", CharSet = CharSet.Unicode)]
        public static extern UInt32 PowerReadDCValueIndex(
            IntPtr RootPowerKey, ref Guid SchemeGuid,
            ref Guid SubGroupOfPowerSettingsGuid,
            ref Guid PowerSettingGuid,
            ref UInt32 AcValueIndex
        );

        static void Main(string[] args)
        {
            Guid scheme = GetActiveSchemeGuid();

            bool sleepLockEnabledAC = (GetACValue(scheme, SUB_NONE, CONSOLELOCK) == 1) ? true : false;
            bool sleepLockEnabledDC = (GetDCValue(scheme, SUB_NONE, CONSOLELOCK) == 1) ? true : false;

            Console.WriteLine("Sleep lock enabled on AC : " + sleepLockEnabledAC);
            Console.WriteLine("Sleep lock enabled on DC : " + sleepLockEnabledDC);
            Console.ReadLine();
        }

        static Guid GetActiveSchemeGuid()
        {
            IntPtr activeSchemePtr = IntPtr.Zero;
            uint res = PowerGetActiveScheme(IntPtr.Zero, ref activeSchemePtr);
            GuidClass temp = new GuidClass();
            Marshal.PtrToStructure(activeSchemePtr, temp);
            Guid scheme = temp.Value;
            return scheme;
        }

        /// <summary>
        /// Get setting for Plugged in
        /// </summary>
        static UInt32 GetACValue(Guid scheme, Guid subgroup, Guid setting)
        {
            UInt32 value = 0;
            PowerReadACValueIndex(IntPtr.Zero, ref scheme, ref subgroup, ref setting, ref value);
            return value;
        }

        /// <summary>
        /// Get setting for On battery
        /// </summary>
        static UInt32 GetDCValue(Guid scheme, Guid subgroup, Guid setting)
        {
            UInt32 value = 0;
            PowerReadDCValueIndex(IntPtr.Zero, ref scheme, ref subgroup, ref setting, ref value);
            return value;
        }
    }
}

调试:

1

在 AC 上启用 sleep 锁定:真

2

在 AC 上启用 sleep 锁定:错误

关于c++ - 以编程方式获取 Windows 设置 |账户设置 |需要登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61768023/

相关文章:

android - 为 android 使用 api 识别视觉

c++ - 将三字母语言代码转换为语言标识符 (LANGID)

c++ - llvm InitializeNativeTarget() 未定义

c++ - asio::tcp::socket 的async_read_some 和async_receive 有什么区别?

api - linkshare 自动链接生成器超时

php - Dart 与 PHP 代码中的不同哈希结果

c# - 使用 Powershell 以编程方式清除回收站

winapi - 找不到用于链接的 Ocamlrun.lib

c++ - 我的代码在 Windows XP 上不工作

c++ - 如何启用_if 具有可变模板参数的类?