簡體   English   中英

在Win7中刷新Windows資源管理器

[英]Refresh Windows Explorer in Win7

我的程序設置"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced""Hidden" Hovewer我無法刷新資源管理器以考慮此更改。 我試過了:

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自己刷新資源管理器,那么它可行。 Hovewer我想要一些優雅的解決方案,所以即使在當前打開的OpenFile / SaveFile對話框中,它也會刷新顯示器。

我正在使用C#.NET,Win7。

狀態更新#1

正如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();

所以這一部分已經完成。 Hovewer我仍然需要刷新OpenFile / SaveFile對話框,上面的代碼不會這樣做。 有人知道如何刷新這些對話框嗎?

重要的一點是,如果我在“控制面板”中的“文件夾選項”中更改“顯示隱藏文件”,系統不會刷新那些OpenFile / SaveFile對話框,我必須使用F5手動刷新它們。 我只是在尋找一種方法如何使用C#刷新所有這些對話框,所以我不再需要再按F5了...

狀態更新#2

好吧,所以上面的代碼出現了新的問題 - 它不僅刷新了Windows資源管理器,還刷新了互聯網資源管理器...任何想法如何刷新Windows資源管理器?

我找到了一種方法來檢查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);
            }
        }

我不知道打開/保存對話框,但你可以獲得一個帶有COM自動化的開放資源管理器窗口列表, Shell.Application對象有一個窗口集合 ,或直接CoCreate IID_IShellWindows,列表中的每個窗口都有一個刷新方法。

WSH / JScript的:

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

我不知道C#,但這里有一些處理WSH / JScriptc ++中的 shell窗口的例子

當您安裝注冊文件類型的應用程序時,資源管理器窗口通常會刷新以指示新關聯 - 您是否可以監視安裝程序正在進行的API調用以查看它是如何刷新窗口的?

Windows 10更改了Explorer窗口的名稱:

if ((itemName == "Windows Explorer") || (itemName == "File Explorer")) {
    itemType.InvokeMember("Refresh", System.Reflection.BindingFlags.InvokeMethod, null, item, null);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM