Предотвращение переполнения Registry.GetValue - PullRequest
0 голосов
/ 14 ноября 2010

Я пытаюсь получить DWM colorizationColor , используя: Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\DWM").GetValue("ColorizationColor")

однако возвращается -2144154163 (реальное значение 2150813133 )

Я думаю, это потому, что значение не может быть сохранено в 32-битном int ... однако преобразование событий (или преобразование) в int64 завершается неудачей.

PD: Это может звучать как простой вопрос, но я не могу найти решение: (

Ответы [ 2 ]

2 голосов
/ 14 ноября 2010

Значения цвета довольно непрактичны, поскольку значения 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 голос
/ 14 ноября 2010

Вам необходимо сделать неконтролируемое приведение:

unchecked {
    value = (uint)intValue;
}

РЕДАКТИРОВАТЬ : Registry.GetValue возвращает object, содержащее значение Int32 в штучной упаковке.
Вы не можете распаковать значение и привести к другому типу значения в единственном приведении .

При приведении непосредственно из объекта необходимо сначала распаковать его в его фактический тип, а затем привести к uint:

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