原因:如果程序在桌面上创建了新的文件,在没有程序执行桌面刷新(包括按键F5事件和桌面右键菜单中的刷新事件)之前,新创建的文件图标是不会显示在桌面上的,原因是系统并没有接到重绘图标消息。但这个消息并不是WM_PAINT消息,而是刷新特定系统目录,再导致系统自动发送WM_PAINT重绘桌面。所以直接调用诸如::InvalidateRect()是没有任何效果的。
桌面文件(包括快捷方式)都保存在特定的文件夹中,可以通过SHGetSpecialFolderPath取得。当然,也可以通过这个函数来刷新系统的整个目录,试过以后就知道执行速度有多么地慢了,甚至可以清楚的听到硬盘遍历的声音。其实只要刷新一个很小的目录就OK的。这里转载 一叶屏风 Blog中的内容,方法有很多,都可取,各需所用。推荐使用第6种方法,原因是通过发送F5击键消息,可以直接调用桌面刷新的相关代码,也就无需考虑代码细节,微软写好的代码爱用白不用。
Quote from:http://hi.baidu.com/kenterr/blog/item/33a8c345a2df903a8694736c.html
================================================================================
1、刷新桌面及其子窗口
::RedrawWindow(NULL, NULL, NULL, RDW_ERASE|RDW_INVALIDATE|RDW_ALLCHILDREN);
2、刷新桌面及其子窗口
::InvalidateRect(NULL, NULL, TRUE);
::UpdateWindow(NULL);// can be ignored
3、shell API通知桌面更新,速度慢,不更新子窗口
::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
4、重换壁纸,耗资源
TCHAR tszPath[MAX_PATH];
::ZeroMemory(tszPath, MAX_PATH);
::SystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, tszPath, 0);
::SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, tszPath, SPIF_UPDATEINIFILE|SPIF_SENDWININICHANGE);
5、COM shell接口,only xp support IShellDispatch4,会置所有窗口最小化
CoInitialize(0);
IShellDispatch4 * pdisp = NULL;
HRESULT hr = CoCreateInstance(CLSID_Shell, NULL, CLSCTX_ALL,
__uuidof(IShellDispatch4), (void**)&pdisp);
if (SUCCEEDED(hr))
{
pdisp->ToggleDesktop();
pdisp->Release();
}
CoUninitialize();
6、发F5 keydown消息,不更新子窗口
HWND desktop;
desktop = ::FindWindow(_T("ProgMan"), NULL);
desktop = ::GetWindow(desktop, GW_CHILD);
desktop = ::GetWindow(desktop, GW_CHILD);
if (desktop)
{
::SetForegroundWindow(desktop);
::PostMessage(desktop, WM_KEYDOWN, VK_F5, 0);
::PostMessage(desktop, WM_KEYUP, VK_F5, 0);
// the two can be instead of ::keybd_event(VK_F5, 0, 0, 0);
}
7、Invalidate桌面句柄,不更新子窗口
HWND desktop;
desktop = ::FindWindow(_T("ProgMan"), NULL);
desktop = ::GetWindow(desktop, GW_CHILD);
desktop = ::GetWindow(desktop, GW_CHILD);
if (desktop)
{
::InvalidateRect(desktop, NULL, TRUE);
}
GetDestopWindow取到的是桌面窗口的句柄,但不是我们所看到的那个包含图标的窗口。
包含图标的窗口实际上是DesktopWindow的一个子窗口。确切地讲,DesktopWindow包含一个无标题的、
类名为“SHELLDLL_DefView”的子窗口,这个字窗口又包含一个无标题的、类名为“SysListView32”的
子窗口。这才是那个真正包含桌面图标的窗口。
===============================================================================
//注:totally copy from:http://caily1985.spaces.live.com/blog/cns!93ADCA97ABBDD7F!1285.entry