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


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

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

帅哥哟,离线,有人找我吗?
雨中的泪
  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


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


加好友 发短信
等级:一尾狐 帖子:449 积分:3506 威望:0 精华:5 注册:2008/9/1 2:32:00
  发帖心情 Post By:2011/8/7 19:15:00 [只看该作者]

试一下吧,应可以的!

 

全局代码:

 

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer

 

Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

 

 

运行代码:

 

Dim hwnd As Integer = FindWindow("Progman", "Program Manager")

Const WM_KEYDOWN = &H100
Const VK_F5=&H74

'发送消息模拟按键"F5"刷新桌面

PostMessage(hwnd, WM_KEYDOWN, VK_F5, 0 )


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


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

谢谢 gdlgh 老大,谢谢

十万分的感谢

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


 回到顶部
帅哥哟,离线,有人找我吗?
gdlgh
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:449 积分:3506 威望:0 精华:5 注册:2008/9/1 2:32:00
  发帖心情 Post By:2011/8/7 21:12:00 [只看该作者]

其实帮助解决问题也是一个学习的过程!

呵。大家共勉吧!


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


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

谢谢 gdlgh 老大,谢谢

 回到顶部