سؤال

مجموعات برنامجي "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 أشار إلى أن هناك طريقة بسيطة لتحديث Windows Explorer باستخدام 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 Explorer ، ولم يكن لدي ما يكفي من مندوب لإضافة تعليق ، لذا اعتقدت أنني سأرسله كإجابة لمساعدتك لأن هذا السؤال ساعدني.

        // 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);
            }
        }

نصائح أخرى

لا أعرف عن مربعات حوار Open/Save ، ولكن يمكنك الحصول على قائمة من Windows Open Explorer مع أتمتة 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#، ولكن فيما يلي أمثلة تتعامل مع Windows في WSH/JScript و C ++

عند تثبيت تطبيق يسجل نوع ملف ، غالبًا ما يتم تحديث Windows Explorer للإشارة إلى الارتباط الجديد - هل يمكنك التجسس على مكالمات API التي يقوم بها المثبت لمعرفة كيفية تحديث النافذة؟

مع تغيير Windows 10 اسم نافذة Explorer:

if ((itemName == "Windows Explorer") || (itemName == "File Explorer")) {
    itemType.InvokeMember("Refresh", System.Reflection.BindingFlags.InvokeMethod, null, item, null);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top