Windows 10任务栏的颜色检索

6
我发现,System.Windows.SystemParameters类中有一个静态属性,它声明了用户选择的Windows整体颜色。但是对于用户来说,还有第二种可能性,即启用或禁用任务栏/窗口栏使用相同的颜色。我无法在SystemParameters类中找到该键。
1个回答

7
我相信有一个注册表值可以找到颜色,它可能在以下位置:

HKEY_CURRENT_USER\Control Panel\Colors

然而,在我的系统上,任务栏颜色已被禁用,并且该颜色值似乎不会出现在此键中。
一个解决方法是结合以下两个问题的答案:
  1. 任务栏位置
  2. 如何读取屏幕像素的颜色
您需要使用以下导入:
[DllImport("shell32.dll")]
private static extern IntPtr SHAppBarMessage(int msg, ref APPBARDATA data);

[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
private static extern int BitBlt(IntPtr hDC, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, int dwRop);

以下结构体:
private struct APPBARDATA
{
    public int cbSize;
    public IntPtr hWnd;
    public int uCallbackMessage;
    public int uEdge;
    public RECT rc;
    public IntPtr lParam;
}

private struct RECT
{
    public int left, top, right, bottom;
}

以下是常量:

private const int ABM_GETTASKBARPOS = 5;

然后您可以调用以下两种方法:

public static Rectangle GetTaskbarPosition()
{
    APPBARDATA data = new APPBARDATA();
    data.cbSize = Marshal.SizeOf(data);

    IntPtr retval = SHAppBarMessage(ABM_GETTASKBARPOS, ref data);
    if (retval == IntPtr.Zero)
    {
        throw new Win32Exception("Please re-install Windows");
    }

    return new Rectangle(data.rc.left, data.rc.top, data.rc.right - data.rc.left, data.rc.bottom - data.rc.top);
}

public static Color GetColourAt(Point location)
{
    using (Bitmap screenPixel = new Bitmap(1, 1, PixelFormat.Format32bppArgb))
    using (Graphics gdest = Graphics.FromImage(screenPixel))
    {
        using (Graphics gsrc = Graphics.FromHwnd(IntPtr.Zero))
        {
            IntPtr hSrcDC = gsrc.GetHdc();
            IntPtr hDC = gdest.GetHdc();
            int retval = BitBlt(hDC, 0, 0, 1, 1, hSrcDC, location.X, location.Y, (int)CopyPixelOperation.SourceCopy);
            gdest.ReleaseHdc();
            gsrc.ReleaseHdc();
        }

        return screenPixel.GetPixel(0, 0);
    }
}

就像这样:

Color taskBarColour = GetColourAt(GetTaskbarPosition().Location);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接