質問

私のプログラムセット "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

として 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();

これでこの部分は完了です。 ただし、まだ更新する必要があります 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 オートメーションを使用すると、開いているエクスプローラー ウィンドウのリストを取得できます。 シェル.アプリケーション オブジェクトには 窓のコレクション, 、または 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/JScript そして C++

あなたは、ファイルの種類を登録したアプリケーションをインストールし、

、Explorerのウィンドウは、多くの場合、新しい関連付けを示すために更新する? - あなたはAPI呼び出しをスパイできインストーラがウィンドウをリフレッシュする方法を確認するために行っていること。

:Windowsの10でエクスプローラウィンドウの名前を変更しました
if ((itemName == "Windows Explorer") || (itemName == "File Explorer")) {
    itemType.InvokeMember("Refresh", System.Reflection.BindingFlags.InvokeMethod, null, item, null);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top