1

我正在尝试使用以下方法获取 DWM colorizationColorMicrosoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\DWM").GetValue("ColorizationColor")

但是它返回-2144154163(实际值为2150813133

我认为这是因为该值不能保留在 32 位 int 上……但是事件转换(或转换)到 int64 失败。

PD:这听起来像是一个容易回答的问题,但我找不到解决方案:(

4

2 回答 2

3

颜色值作为 int 值是非常不切实际的,最好快速转换它。处理密钥的小包装器也不会受到伤害:

using System.Drawing;
...
        public static Color GetDwmColorizationColor() {
            using (var key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\DWM")) {
                return Color.FromArgb((int)key.GetValue("ColorizationColor"));
            }
        }

但是不要这样做,它有一个记录在案的 API。P/Invoke DwmGetColorizationColor() 获取值,您将获得保证的兼容性行为。如果某些未来的 Windows 版本更改此注册表详细信息,则很重要。访问 pinvoke.net 以获取声明。

于 2010-11-14T15:25:20.103 回答
2

您需要进行未经检查的演员表:

unchecked {
    value = (uint)intValue;
}

编辑Registry.GetValue返回一个object包含一个装箱Int32值。
您不能将值拆箱并在一次强制转换中转换为不同的值类型

当直接从对象进行转换时,您需要先将其拆箱为其实际类型,然后将其转换为uint

unchecked {
    value = (uint)(int)boxedObject;
}
于 2010-11-14T15:09:19.653 回答