检索Windows 10任务栏

时间:2017-01-23 11:17:13

标签: c# windows-10 customization

我发现,System.Windows.SystemParameters类中有一个静态属性,用于声明用户为其Windows整体选择的颜色。

但是,对于启用或禁用任务栏/窗口栏应该使用相同颜色的用户,还有第二种可能性。

我无法在SystemParameters类中找到关键字。

1 个答案:

答案 0 :(得分:3)

我相信有一个注册表值可以找到颜色,它可能在里面:

HKEY_CURRENT_USER\Control Panel\Colors

但是在我的系统上,我在任务栏上禁用了颜色,并且该颜色值似乎没有出现在此键中。

解决方法是将答案与以下两个问题结合起来:

  1. TaskBar Location
  2. How to Read the Colour of a Screen Pixel
  3. 您需要以下导入:

    [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);