Как сделать иконки Рабочего стола прозрачными

Тема в разделе "Delphi", создана пользователем WinHack, 23 ноя 2016.

  1. WinHack
    Сначала нужно найти дескриптор окна, которое содержит значки Рабочего Стола.

    Вот эта функция:

    Код:
    uses Windows;
    
    function DZGetDesktopIconWindow: HWND;
    begin
      Result := FindWindow(PChar('Progman'),
          PChar('Program Manager'));
      Result := FindWindowEx(Result, 0,
          PChar('SHELLDLL_DefView'), nil);
      Result := FindWindowEx(Result, 0,
          PChar('SysListView32'), nil);
    end;
    А это, как достичь эффекта прозрачности:

    Код:
    uses Windows, CommCtrl;
    
    procedure DZSetDesktopIconTransparent;
    var
      Desktop : HWND;
    begin
      Desktop := DZGetDesktopIconWindow;
      ListView_SetTextBkColor(Desktop, MAXDWORD);
      ListView_RedrawItems(Desktop, 0, Pred(
          ListView_GetItemCount(Desktop)));
      UpdateWindow(Desktop);
    end;
    Между прочим, Вы можете установить любой цвет фона или текста заголовка значка, не только прозрачным. Вот пример:

    Код:
    uses Windows, CommCtrl,
      Graphics; // Только для определения TColor
    
    procedure DZSetDesktopIconColors(const FColor, BColor: TColor);
    var
      Desktop : HWND;
    begin
      Desktop := DZGetDesktopIconWindow;
      ListView_SetTextColor(Desktop, FColor);
      ListView_SetTextBkColor(Desktop, BColor);
      ListView_RedrawItems(Desktop, 0, Pred(
          ListView_GetItemCount(Desktop)));
      UpdateWindow(Desktop);
    end;
    В процедуре выше FColor - цвет текста, BColor - цвет фона.

    И наконец, эта процедура сбросит Ваши цвета назад после Ваших экспериментов над ними:

    Код:
    uses Windows;
    
    procedure DZResetDesktopIconColors;
    var
      Kind, Color : Integer;
    begin
      Kind := COLOR_DESKTOP;
      Color := GetSysColor(COLOR_DESKTOP);
      SetSysColors(1, Kind, Color);
    end;