Win7 で Windows エクスプローラーを更新する
-
21-09-2019 - |
質問
私のプログラムセット "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 エクスプローラーのみを更新する方法はありますか?
解決
私がチェックする方法を考え出しました私に出てます。
// 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呼び出しをスパイできインストーラがウィンドウをリフレッシュする方法を確認するために行っていること。
エクスプローラウィンドウの名前を変更しました
if ((itemName == "Windows Explorer") || (itemName == "File Explorer")) {
itemType.InvokeMember("Refresh", System.Reflection.BindingFlags.InvokeMethod, null, item, null);
}