2017-01-23 7 views
3

Я узнал, что в классе System.Windows.SystemParameters есть статическое свойство, которое объявляет цвет, который пользователь выбрал для своей Windows в целом.Получить цвет окна 10 панели задач

Но есть еще одна возможность для пользователя, которая позволяет ему включать или отключать, должна ли панель задач/оконная панель использовать тот же самый цвет.

Мне не удалось найти ключ для этого в классе SystemParameters.

+1

Был мой ответ полезным? Если это так, вы можете взломать и принять его, чтобы другие могли узнать, поможет ли эта информация. – TheLethalCoder

ответ

2

Я считаю, что значение реестра, чтобы найти цвет, и это, вероятно, внутри:

HKEY_CURRENT_USER\Control Panel\Colors 

Однако на моей системе я имею цвета на панель задач отключен, и это значение цвета, кажется, не появляются в этот ключ.

работа вокруг было бы объединить ответы на следующие два вопроса:

  1. TaskBar Location
  2. How to Read the Colour of a Screen Pixel

Вам нужны следующие импорта:

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

The следующие структуры:

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