刷新桌面

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”的
子窗口。这才是那个真正包含桌面图标的窗口。



原文出处:http://hi.baidu.com/oubfuedrhnbfgiq/item/7f8ba6c4ed467855bcef69e2

你可能感兴趣的:(刷新桌面)