0


0

Registry.GetValueオーバーフローの防止

「Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@ "Software \ Microsoft \ Windows \ DWM")。GetValue( "ColorizationColor")」を使用してDWM _colorizationColor_を取得しようとしています。

ただし、*-2144154163 *を返しています(実際の値は_2150813133_です)

これは、値が32ビット整数で保持できないためだと思います…​ ただし、int64へのイベントキャスト(または変換)は失敗します。

PD:簡単に答えられる質問のように聞こえるかもしれませんが、解決策が見つかりません:(

2 Answer


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


未チェックのキャストを作成する必要があります。

unchecked {
    value = (uint)intValue;
}

編集Registry.GetValue`は、ボックス化された Int32`値を含む `オブジェクト`を返します。 + http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx [値をボックス化解除して、1回のキャストで異なる値型にキャストすることはできません]。

オブジェクトから直接キャストする場合、まず実際の型にボックス化を解除し、次に `uint`にキャストする必要があります。

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