代码之家  ›  专栏  ›  技术社区  ›  Paya

在Win7中刷新Windows资源管理器

  •  16
  • Paya  · 技术社区  · 16 年前

    我的程序集 "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" 价值 "Hidden" . 我不能刷新资源管理器来考虑这个更改。我试过了:

    1)

        SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero);` 
    

    2)

        SHELLSTATE state = new SHELLSTATE(); 
        state.fShowAllObjects = (uint)1; 
        SHGetSetSettings(ref state, SSF.SSF_SHOWALLOBJECTS, true); 
    

    3)

        SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 5000, ref dwResult); 
    

    4)

        SendMessage(HWND_BROADCAST, WM_COMMAND, 28931 /* Refresh */, 0); 
    

    没有效果。那我该怎么办?如果我用F5刷新资源管理器,它就会工作。我想要一些优雅的解决方案,所以它可以使任何地方的显示器都焕然一新,即使在 OpenFile / SaveFile 当前打开的对话框。

    我正在使用C.NET,Win7。

    状态更新1

    AS Anders 指出,有一种使用COM刷新资源管理器窗口的简单方法:

    Guid CLSID_ShellApplication = new Guid("13709620-C279-11CE-A49E-444553540000");
    Type shellApplicationType = Type.GetTypeFromCLSID(CLSID_ShellApplication, true);
    dynamic shellApplication = Activator.CreateInstance(shellApplicationType);
    dynamic windows = shellApplication.Windows();
    for (int i = 0; i < windows.Count; i++)
        windows.Item(i).Refresh();
    

    所以这部分完成了。 我还是需要刷新 打开文件 / 萨维菲尔 对话框,上面的代码不会这样做。有人知道如何刷新这些对话框吗?

    重要的一点是,如果我在“控制面板”的“文件夹选项”中更改“显示隐藏文件”,则 打开文件 / 萨维菲尔 系统没有刷新对话框,我必须使用F5手动刷新它们。我只是在寻找一种方法,如何使用c_刷新所有这些对话框,所以我不需要再按f5…

    状态更新2

    好吧,上面代码的新问题-它不仅刷新Windows资源管理器,而且刷新Internet资源管理器…知道如何只刷新Windows资源管理器吗?

    3 回复  |  直到 16 年前
        1
  •  16
  •   Adam    16 年前

    我找到了一种方法来检查Windows是否是一个Windows资源管理器窗口,并且没有足够的代表添加评论,所以我认为我会提交它作为答案来帮助您,因为这个问题帮助了我。

            // based on http://stackoverflow.com/questions/2488727/refresh-windows-explorer-in-win7
            Guid CLSID_ShellApplication = new Guid("13709620-C279-11CE-A49E-444553540000");
            Type shellApplicationType = Type.GetTypeFromCLSID(CLSID_ShellApplication, true);
    
            object shellApplication = Activator.CreateInstance(shellApplicationType);
            object windows = shellApplicationType.InvokeMember("Windows", System.Reflection.BindingFlags.InvokeMethod, null, shellApplication, new object[] { });
    
            Type windowsType = windows.GetType();
            object count = windowsType.InvokeMember("Count", System.Reflection.BindingFlags.GetProperty, null, windows, null);
            for (int i = 0; i < (int)count; i++)
            {
                object item = windowsType.InvokeMember("Item", System.Reflection.BindingFlags.InvokeMethod, null, windows, new object[] { i });
                Type itemType = item.GetType();
    
                // only refresh windows explorers
                string itemName = (string)itemType.InvokeMember("Name", System.Reflection.BindingFlags.GetProperty, null, item, null);
                if (itemName == "Windows Explorer")
                {
                    itemType.InvokeMember("Refresh", System.Reflection.BindingFlags.InvokeMethod, null, item, null);
                }
            }
    
        2
  •  2
  •   Anders    16 年前

    我不知道如何打开/保存对话框,但是您可以通过COM自动化获得一个打开的资源管理器窗口的列表, Shell.Application 对象具有 collection of windows 或者直接共同创建IID_IshellWindows,列表中的每个窗口都有一个刷新方法。

    WSH/JScript:

    for(var sw=new ActiveXObject("Shell.Application").Windows(),i=0;i<sw.Count; ++i)
       sw.Item(i).Refresh();
    

    我不知道C,但这里有一些示例处理中的shell窗口 WSH/JScript c++

        3
  •  0
  •   ultrafez    16 年前

    当您安装一个注册文件类型的应用程序时,资源管理器窗口经常刷新以指示新的关联-您可以监视安装程序正在进行的API调用以查看它如何刷新窗口吗?

    推荐文章