防止Registry.GetValue溢出

时间:2010-11-14 15:06:55

标签: c# registry dwm

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

然而它返回 -2144154163 (实际值 2150813133

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

PD:这可能听起来像一个简单的问题,但我无法找到解决方案:(

2 个答案:

答案 0 :(得分:2)

颜色值作为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进行声明。

答案 1 :(得分:1)

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

unchecked {
    value = (uint)intValue;
}

编辑Registry.GetValue返回包含object盒装值的Int32
You cannot unbox the value and cast to a different value type in a single cast

直接从对象进行投射时,您需要首先将其拆分为实际类型,然后将其强制转换为uint

unchecked {
    value = (uint)(int)boxedObject;
}