Windows系统的文件浏览器如何触发刷新

最近开发一个Drive程序,修改注册表添加System Folder Drive后需要通知已打开的每个文件浏览器刷新。最初选择获取对应窗体的句柄并发送WM_KEYDOWN、WM_KEYUP的VK_F5消息未果,使用spy++监控Class Name = CabinetWClass、Window Caption = Computer窗体由鼠标右键"刷新"后所产生的消息,最终由Window Caption = ShellView的窗体句柄处理。代码很简单但调用FindWindowEx较多,但这并不是最佳方案。在MSDN搜索相关问题发现老外推荐参考"Folder Options"的"Apply"按钮所产生的消息,它会立刻刷新相关已打开的文件浏览器,实际由:WM_COMMAND、wparam = 41504组成。于是代码简化如下:

void RefreshWindow(const TCHAR* lpClassName, const TCHAR* lpWindowName)
{
    auto hWnd = ::FindWindow(lpClassName, lpWindowName);

    while (hWnd != NULL)
    {
        ::PostMessage(hWnd, WM_COMMAND, 41504, 0);
        hWnd = FindWindowEx(NULL, hWnd, lpClassName, lpWindowName);
    }
}
RefreshWindow(_T("CabinetWClass"), _T("Computer"));

由于CabinetWClass是顶层窗体,完全可以选择发送一个窗口句柄等于HWND_BROADCAST的消息来通知所有顶层窗体达到相同的效果。

::PostMessage(HWND_BROADCAST, WM_COMMAND, 41504, NULL);

 

posted @ 2013-10-11 20:28  junchu25  阅读(705)  评论(0编辑  收藏  举报