سؤال

في طلبي ، يمكنني فتح Explorer برمجيًا وتحديد ملف باستخدام الكود التالي:

void BrowseToFile(LPCTSTR filename)
{
    CString strArgs; 
    strArgs = _T("/select,\"");
    strArgs += filename; 
    strArgs += _T("\"");

    ShellExecute(0, _T("open"), _T("explorer.exe"), strArgs, 0, SW_NORMAL);
}

مشكلتي هي أنه إذا اتصلت بهذه الوظيفة مرة ثانية بملف مختلف ، ولكن في نفس المجلد ، فإن التحديد في Explorer لا يتغير إلى الملف الجديد ، ولكن يبقى في الملف السابق.

على سبيل المثال ، إذا اتصلت بوظيفتي مع C:\path\to\file1.txt, ، سيفتح نافذة مستكشف جديدة و file1.txt سيتم اختياره. إذا اتصلت بوظيفتي للمرة الثانية مع C:\path\to\file2.txt, ، سيتم تنشيط نافذة Explorer الحالية ، لكن الاختيار سيظل قيد التشغيل file1.txt.

هل هناك طريقة لإجبار المستكشف على تحديث الاختيار أو طريقة أفضل لإنجاز هذا؟

تعديل:

السلوك المذكور أعلاه كان على نظام التشغيل Windows XP. يبدو أن السلوك على Vista / Win7 مختلف. ستفتح كل مكالمة مثيلًا جديدًا لـ Explorer وحدد الملف.

هدفي الرئيسي هو تكرار خيار Visual Studio افتح محتوى الملف من وثيقة. تتصرف هذه الميزة في Visual Studio على نفس الشيء على XP و Vista و Win7. لن ينشئ مثيلًا جديدًا إذا كان مثيلًا آخر به نفس المجلد مفتوحًا بالفعل ، لكنه سيقوم بتحديث التحديد إلى الملف الجديد.

إذا كان أي شخص يعرف كيف ينجز Visual Studio هذا ، فأنا أحب أن أعرف عنه.

هل كانت مفيدة؟

المحلول

وجدت الجواب على سؤالي. أحتاج إلى استخدام وظيفة shell SHOpenFolderAndSelectItems. فيما يلي رمز الوظيفة إذا كان أي شخص مهتمًا على الإطلاق:

void BrowseToFile(LPCTSTR filename)
{
    ITEMIDLIST *pidl = ILCreateFromPath(filename);
    if(pidl) {
        SHOpenFolderAndSelectItems(pidl,0,0,0);
        ILFree(pidl);
    }
}

نصائح أخرى

جرب خيار '/n'. هذا سوف يفتح مجلد جديد - ربما تم فتحه بالفعل. ولكن ، على الأقل ، تم تحديد الملف الذي تحدده.

/n,/select,<path_and_filename>

ShopEnfolderAndElectItems يفشل دائمًا في حالتي ولا يمكنني معرفة السبب. راجع للشغل ، يجب أن تستدعي coinitialize/coinitializeex قبل الاتصال بهذا.

في الحالة التي حددتها ، تظهر نافذة الملف تحدد فقط الملف عند تهيئته بدلاً من تنشيطه.

على الرغم من أن هذا يبدو وكأنه kludge ، إلا أنه يمكنك اكتشاف XP وفقط لنظام التشغيل الذي يغلق مربع الحوار باستخدام مقبضه وفتح ملف جديد لاستهداف ملف آخر معه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top