Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I programmatically refresh Windows Explorer?

Tags:

I have a Windows shell extension that uses IShellIconOverlayIdentifier interface to display overlay icons on files and folders. My extension is a little like TortoiseCVS or TortoiseSVN.

Sometimes I need to make Windows Explorer redraw all it's icons. To do this, I call SHChangeNotify like this:

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL) 

This refreshes the desktop and right hand pane of any open explorer windows. It doesn't refresh the folder tree on the left hand side of any Explorer windows.

So I tried sending WM_SETTINGCHANGE like this:

SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0)  

on Vista this refreshes the folder tree, but not the right hand pane.

The combination of SHChangeNotify() followed by WM_SETTINGCHANGE seems to work quite well on Vista. But I still can't refresh the folder tree on XP if it is displayed.

Does anyone have any ideas how to do this better?

Is there a better solution for XP?

Sending SHCNE_ASSOCCHANGED is a bit like clubbing Explorer over the head. It causes the whole desktop to refresh quite violently and casues any open Explorer windows to loose there scroll position. Is there anything that's a bit less violent?

like image 838
HughE Avatar asked Mar 15 '09 04:03

HughE


People also ask

How do I force Windows Explorer to refresh?

Right-click on Windows, select Task Manager. In the Processes tab, look for Windows Explorer and right-click on it, then select Restart.

How do I refresh a folder in Explorer?

You can refresh the items in the File Explorer by simply pressing F5 on your keyboard. The F5 key is most likely to be placed in the top row of the keyboard. Also, you can use the CTRL + R keyboard shortcut to refresh the active File Explorer window.

How do I refresh Internet Explorer 11?

Press the combination of keys Control + Alt + Del or, placing the mouse on the taskbar, press the right mouse button and select Task Manager.


1 Answers

Does anyone have any ideas how to do this better?

Personally I don't know. You mention the Tortoise programs which do a similar thing, so an excellent starting point would be to have a look at what they do in their source :)

These look to be the relevant source files that handle this problem:

  • TortoiseCVS - ShellUtils.cpp
  • TortoiseSVN - ShellUpdater.cpp (username: "guest", password: "")

I note in the RebuildIcons method in each of those will:

  1. set the shell icon size or colour depth to a temporary value
  2. updates all the windows by broadcasting the setting change
  3. resets the shell icon size or colour depth to the original value
  4. updates all the windows a second time with a broadcast of the setting change

Perhaps this is part of the trick to get things working in XP.

like image 167
Simon Lieschke Avatar answered Sep 16 '22 21:09

Simon Lieschke