zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    WITH HINDSIGHT
    圆桌最后冲刺
    圆桌总结
    圆桌十日冲刺之⑨
    圆桌十日冲刺之八
    圆桌十日冲刺之七
    圆桌十日冲刺之六
    【09NOIP提高组】Hankson 的趣味题(信息学奥赛一本通 1856)(洛谷 1072)
    灯泡(信息学奥赛一本通 1438)
    最大公约数(信息学奥赛一本通 1627)
  • 原文地址:https://www.cnblogs.com/junchu25/p/3364128.html
Copyright © 2011-2022 走看看