Click here to Skip to main content
11,478,896 members (75,688 online)
Click here to Skip to main content

Transparent desktop icons

, 30 Dec 2004 120.4K 33
Rate this:
Please Sign up or sign in to vote.
A brief discussion on what is involved in making the text background of the desktop icons transparent.

Introduction

Several years ago, I downloaded a program called TransparentW that would make the text background of the desktop icons transparent. It was cool and made the desktop a whole lot prettier. What struck my fancy was the author's (Jay Guerette) comment about similar utilities asking for money considering how much time and code was involved.

I've used this utility on nearly all of the machines I've worked on and have never given it a second thought. Until today, that is. Curiosity got the best of me and I wanted to know just how much, or how little in this case, code was involved in accomplishing this task. Here are the relevant pieces of code. The first thing to do is find the listview window that owns the desktop icons.

Finding the right window

There are two ways of finding the correct window. One is a bit cleaner than the other, but I'll show both just for comparison purposes.

My first thought was to use GetDesktopWindow() to find the listview window, but the handle returned was not what I expected. I could, however, use it to enumerate all child windows of the desktop, stopping when the listview window was found.

BOOL CALLBACK EnumProc( HWND hWnd, LPARAM )
{
    TCHAR   szClass[128];

    GetClassName(hWnd, szClass, sizeof(szClass));
    if (lstrcmp(szClass, "SysListView32") == 0)
        return FALSE;

    return TRUE;
}
...
hWnd = GetDesktopWindow();
if (NULL != hWnd)
    EnumChildWindows(hWnd, EnumProc, 0);

It looks good, but the problem is that the desktop owns several listview windows.

BOOL CALLBACK EnumProc( HWND hWnd, LPARAM )
{
    TCHAR   szClass[128];

    GetClassName(hWnd, szClass, sizeof(szClass));
    if (lstrcmp(szClass, "SysListView32") == 0)
    {
        GetClassName(GetParent(hWnd), szClass, sizeof(szClass));
        if (lstrcmp(szClass, "SHELLDLL_DefView") == 0)
        {
            GetClassName(GetParent(GetParent(hWnd)), szClass, 
                   sizeof(szClass));
            if (lstrcmp(szClass, "Progman") == 0)
            {
                // we now have the window that is a child of
                // "SHELLDLL_DefView" and a grandchild of "Progman"
                return FALSE;
            }
        }
    }

    return TRUE;
}

Notice how the calls to GetParent() could get out of hand, or extra variables would be needed. The window handle can be saved in a global variable, or in the LPARAM parameter. The latter is done via:

*((HWND *) lParam) = hWnd;

assuming that EnumChildWindows() was called with a HWND* variable as the third parameter.

A slightly more elegant solution is to make a few calls to FindWindowEx(). This looks like:

hWnd = FindWindow("Progman", NULL);
// start with FindWindow() to get the initial hWnd

if (NULL != hWnd)
    hWnd = FindWindowEx(hWnd, NULL, "SHELLDLL_DefView", NULL);
if (NULL != hWnd)
    hWnd = FindWindowEx(hWnd, NULL, "SysListView32", NULL);

If you've never used Spy++ that ships with Visual Studio, this is a very good project to cut your teeth on. When you start the utility, open the Find Window dialog and select the Desktop, with the little crosshair. Notice that the window has no caption and the class is SysListView32. Click the OK button. In the ensuing Window Properties dialog, click the Windows tab. The listview control has a parent (click the handle) belonging to the SHELLDLL_DefView class. This window, in turn, has a parent (click the handle) belonging to the Progman class and has a Program Manager caption.

Making the change

Once the correct window handle of the listview control has been obtained, the background color can be changed. A check is done on the current background color to prevent an unnecessary change.

// if the window was found, ...
if (NULL != hWnd)
{
    COLORREF colorBackground = 
        ListView_GetTextBkColor(hWnd); // LVM_GETTEXTBKCOLOR
    if (0xffffffff != colorBackground)
    {
        ListView_SetTextBkColor(hWnd, 0xffffffff); // LVM_SETTEXTBKCOLOR

        // add the 'desktop' to the update region
        InvalidateRect(hWnd, NULL, TRUE);

        // paint the update regions
        UpdateWindow(hWnd);
    }
}

Now since the desktop window can be refreshed at any time (e.g., games), the background color will then be reverted back to its non-transparent state. One solution is to couple this code with a timer of some sort and re-check the background color periodically.

Notes

While this method works fine (for most folks), it is still considered a "hack", and thus a more preferred method was born. See here for details. I don't agree with their "These programs not only consume valuable memory and processing time..." statement, however. Their solution actually modifies an OS file. That's all well and good, but they claim it is against company policy to disclose which file(s) are altered. I was able to get the name of the file, however.

Enjoy!

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

DavidCrow
Software Developer (Senior) Pinnacle Business Systems
United States United States

The page you are looking for might have been removed, had its name changed, or is temporarily unavailable.

HTTP 404 - File not found
Internet Information Services

Comments and Discussions

 
QuestionThanks for the info! - just what I needed Pin
Fred Koschara11-Jun-06 3:49
memberFred Koschara11-Jun-06 3:49 
I wish I had seen this article *before* I paid PC Magazine to download SeeThru, thinking there would be source code with the program (there wasn't).

My biggest question, now, is if there's a system hook I can install that will tell me when the desktop is going to be repainted, so I don't have to use a timer to keep it updated. Any ideas, anybody?

I also came across the NixSoftware site at about the same time I found this article, and I find their "solution" scary. It won't work in my case, either, where I'm writing a program that needs to maintain transparent icon label backgrounds: What should I do, tell my customers they have to patch their O/S files to get my program to work? Uh-uh, that's not in my plans!

I'm really curious which file they alter, though....

-- Fred Koschara

________________________________________________________________________
Ignorance can easily be cured by knowledge, stupidity is generally only cured by death...

Truth and Falsehood were bathing. Falsehood came out of the water first and dressed herself in Truth's clothes. Truth, unwilling to put on the garments of Falsehood, went naked. (Author Unknown)

The "war on terror" is a sham: There is no real protection against suicidal maniacs spurred on by creative madmen. In the end, the only outcomes will be the destruction of the American economy due to pouring a bankrupting stream of wealth into a bottomless pit, and the final destruction of personal liberty in the name of "security." (When was the last time you were asked for "Your papers, please?" - er, that is, "License and registration?")

PhotoByFred.com, your daily dose of art
L5 Development Group - private sector (commercial) space development
Sign up for the free Space History newsletter
FKE Internet, Web hosting for space related business
  Domain registration - $15.95/year, $29.95 for 2 years
Edge Lit Boston and Other Photos - limited edition prints available
L5 Software Development - "Out of this world" sites & software
ThmIndxr™, the *only* HTML thumbnail/indexer you need!
wCapLock™, makes CapsLock work like it does on a typewriter
How much did your last traffic ticket cost you? StopHighwayRobbery.com
FredLines™, T-Shirts For the Thinking Mind™ - You've seen them, now wear them!
wfredk.com, my personal Web page - stop by some time!

GeneralFinding Name of Icons Pin
BBJ_NYC12-Aug-05 16:47
memberBBJ_NYC12-Aug-05 16:47 
GeneralRe: Finding Name of Icons Pin
DavidCrow13-Aug-05 17:14
memberDavidCrow13-Aug-05 17:14 
GeneralRe: Finding Name of Icons Pin
BBJ_NYC1-Sep-05 6:15
memberBBJ_NYC1-Sep-05 6:15 
GeneralRe: Finding Name of Icons Pin
DavidCrow2-Sep-05 5:29
memberDavidCrow2-Sep-05 5:29 
GeneralRe: Finding Name of Icons Pin
Rocky-DTT15-May-06 19:21
memberRocky-DTT15-May-06 19:21 
GeneralWorks Great! Pin
John Simmons / outlaw programmer4-May-05 5:02
memberJohn Simmons / outlaw programmer4-May-05 5:02 
QuestionSource code ? Sample ? Pin
Razr33331-Dec-04 19:56
memberRazr33331-Dec-04 19:56 
AnswerRe: Source code ? Sample ? Pin
Sebastian Pipping13-Aug-06 6:08
memberSebastian Pipping13-Aug-06 6:08 
Generalcode doesn't work in VC++ 6.0 Pin
drake2828-Dec-04 16:10
memberdrake2828-Dec-04 16:10 
GeneralPS. Pin
drake2828-Dec-04 16:27
memberdrake2828-Dec-04 16:27 
GeneralRe: PS. Pin
DavidCrow28-Dec-04 17:31
memberDavidCrow28-Dec-04 17:31 
GeneralRe: PS. Pin
drake2829-Dec-04 13:42
memberdrake2829-Dec-04 13:42 
GeneralRe: PS. Pin
DavidCrow30-Dec-04 3:32
memberDavidCrow30-Dec-04 3:32 
GeneralRe: PS. Pin
drake2830-Dec-04 4:55
memberdrake2830-Dec-04 4:55 
GeneralRe: PS. Pin
DavidCrow30-Dec-04 5:58
memberDavidCrow30-Dec-04 5:58 
GeneralRe: PS. Pin
drake2830-Dec-04 5:17
memberdrake2830-Dec-04 5:17 
GeneralRe: PS. Pin
DavidCrow30-Dec-04 5:36
memberDavidCrow30-Dec-04 5:36 
GeneralRe: PS. Pin
tom_dx30-Dec-04 5:40
membertom_dx30-Dec-04 5:40 
GeneralRe: code doesn't work in VC++ 6.0 Pin
DavidCrow28-Dec-04 17:25
memberDavidCrow28-Dec-04 17:25 
Generaltranicon.exe, terminate and stay resident Pin
Kristijan M.22-Mar-04 4:40
memberKristijan M.22-Mar-04 4:40 
GeneralIntensive ways to deal with desktop icons Pin
chrisy26-Nov-03 1:43
memberchrisy26-Nov-03 1:43 
GeneralTry to implement another thing Pin
sotnikov18-Nov-03 22:03
membersotnikov18-Nov-03 22:03 
GeneralAn idea... Pin
Ravi Bhavnani18-Nov-03 13:37
memberRavi Bhavnani18-Nov-03 13:37 
GeneralRe: An idea... Pin
jdunlap18-Nov-03 14:43
memberjdunlap18-Nov-03 14:43 
GeneralRe: An idea... Pin
David Pritchard2-Dec-03 10:07
memberDavid Pritchard2-Dec-03 10:07 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.150520.1 | Last Updated 30 Dec 2004
Article Copyright 2003 by DavidCrow
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid