Foxtable(狐表)用户栏目专家坐堂 → 桌面刷新,如何实现?谢谢


  共有9829人关注过本帖树形打印复制链接

主题:桌面刷新,如何实现?谢谢

帅哥哟,离线,有人找我吗?
雨中的泪
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1432 积分:9061 威望:0 精华:0 注册:2009/8/19 8:19:00
桌面刷新,如何实现?谢谢  发帖心情 Post By:2011/8/7 10:55:00 [显示全部帖子]

资源管理器刷新(桌面或其他)
2011年03月09日 星期三 18:03
关于桌面刷新的方法(Windows SDK)

 

原因:如果程序在桌面上创建了新的文件,在没有程序执行桌面刷新(包括按键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


 回到顶部
帅哥哟,离线,有人找我吗?
雨中的泪
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1432 积分:9061 威望:0 精华:0 注册:2009/8/19 8:19:00
  发帖心情 Post By:2011/8/7 20:58:00 [显示全部帖子]

谢谢 gdlgh 老大,谢谢

十万分的感谢

彻底解决了,上报数据不显示问题,谢谢


 回到顶部
帅哥哟,离线,有人找我吗?
雨中的泪
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1432 积分:9061 威望:0 精华:0 注册:2009/8/19 8:19:00
  发帖心情 Post By:2011/8/8 8:19:00 [显示全部帖子]

谢谢 gdlgh 老大,谢谢

 回到顶部