C# 检索桌面背景颜色并转换为可用值(十六进制?)

C# Retrive Desktop Background Color and Convert to a usable value(hex?)

我有注册表项:

Key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Colors", true);    
tmp = (string)Key.GetValue("Background");

我转换成一个int[]:

char[] spaceSeparator = new char[] { ' ' };
tmpt = tmp.Split(spaceSeparator, StringSplitOptions.None);
tmptINTS = Array.ConvertAll(tmpt, new Converter<string, int>(int.Parse));
a = 255;
r = tmptINTS[0];
g = tmptINTS[1];
b = tmptINTS[2];

现在用 alpha 值存储在一个 uint[] 中:

res = new uint[]{ 0,0,0,0 };
res[0] = Convert.ToUInt32(a);
res[1] = Convert.ToUInt32(r);
res[2] = Convert.ToUInt32(g);
res[3] = Convert.ToUInt32(b);

现在我正在使用这个外部函数来改变背景颜色:

[DllImport("user32.dll")]
public static extern bool SetSysColors(int cElements, int[] lpaElements, uint[] lpaRgbV);

我这样称呼:

int[] aiElements = { 1 };
SetSysColors(1, aiElements, res); // Problem here...

问题是在查看此页面后 PInvoke.net 似乎这个函数只接受这种格式的颜色 [0xAARRGGBB] 其中 AA 是 alpha RR 是红色等等(十六进制)。我已经尝试了无数种不同的方法来获得正确的输出,但我似乎无法做到正确。我试过将数据转换为字节,但我无法让它工作(可能是因为我做错了吗?)。对此有一些见解将不胜感激。我宁愿不使用命名的颜色,因为这对于所有系统颜色名称和所有(I.E Scrollbar_Color)来说有点混乱,而且我真的不想将其简化为切换,因为我希望用户从超过 16 种颜色中挑选(我知道我可以有更多的案例,但为了简洁起见......)

编辑: 任何有类似问题的人的最终工作解决方案:

Key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Colors", true);
tmp = (string)Key.GetValue("Background");
char[] spaceSeparator = new char[] { ' ' };
tmpt = tmp.Split(spaceSeparator, StringSplitOptions.None);
tmptINTS = Array.ConvertAll(tmpt, new Converter<string, int>(int.Parse));
a = 255;
r = tmptINTS[0];
g = tmptINTS[1];
b = tmptINTS[2];
byte[] res = new byte[]{ 0,0,0,0 };
int cnt = 0;
foreach (var value in tmptINTS)
   {
       byte[] byteArray = BitConverter.GetBytes(value);
       res[cnt] = (Byte)value;
       cnt++;
   }
uint[] aColor = new uint[] { 0 };
Buffer.BlockCopy(res, 0, aColor, 0, 4);

aColor 现在格式正确了!

依我看,你这里有两个问题: 首先,您将颜色分量存储在 32 位 uint 中。这不是 windows 期望的格式。您要使用 byte 类型,其值范围为 0-255。 其次,您希望在单个 uint 中提供颜色(尽管我不熟悉您导入的函数)。为此,将您的四个字节值放在一个数组 byte[4] 中,然后使用 Buffer class' BlockCopy 方法复制到一个 uint[1] ,这应该会产生一个 uint采用您要查找的格式,并且已包含在 pinvoke 调用的数组类型中。

编辑:值得注意的是,您 link 在 PInvoke.net 上使用的函数版本与您正在使用的版本不同。 Here 是您在当前 MSDN 文档中尝试使用的函数。 COLORREF 结构 windows 仍可作为 uint 传递,但格式为 0x00BBGGRR - 而不是 0xAARRGGBB