繁体   English   中英

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为红色,依此类推(以十六进制表示)。 我尝试了无数种不同的方法来获得正确的输出,但是我似乎无法正确地进行输出。 我尝试将数据转换为字节,但是无法正常工作(可能是因为我做错了吗?)。 一些对此的见解将不胜感激。 我宁愿不使用命名颜色,因为对于所有系统颜色名称和所有名称(IE 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类的BlockCopy方法复制到uint[1] ,这将导致uint以您要查找的格式显示,并且已包含在pinvoke调用的数组类型中。

编辑:值得注意的是,您在PInvoke.net上链接到的功能版本与所使用的版本不同。 是您试图在当前的MSDN文档中使用的功能。 Windows期望的COLORREF结构窗口仍然可以作为uint传递,但格式为0x00BBGGRR-而不是0xAARRGGBB

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM