الحصول على الاسم الحقيقي للملف تحديد حاليًا في مربع حوار الملف المشترك؟

StackOverflow https://stackoverflow.com/questions/1757093

سؤال

يمكن للمرء الحصول على نص العنصر المحدد في عرض قائمة مربع حوار مشترك. ولكن لا يمكن للمرء أن يحصل على PIDL ، وإذا اختار المستخدم إخفاء الامتدادات المعروفة (الافتراضي) ، فلا يمكن للمرء حقًا معرفة الملف الذي تم اختياره دون امتداده أو PIDL.

قد تكون الطرق الممكنة لحل هذا:

  1. الحصول على Ishellview من مربع حوار ملف Open القياسي. يمكن لـ Ishellview الأساسي معرفة ما هو PIDL للاختيار الحالي. لذلك إذا كان بإمكاني ببساطة الحصول على ishellview ، سأكون ذهبيًا. لسوء الحظ ، لا أرى أي CDM_XXX من شأنه أن يفعل ذلك. ولا يمكنني التفكير في أعلى رأسي عن أي شيء قد يحققه !!! :(
  2. فكرة أخرى؟!

اعتدنا على الاعتماد على حقيقة أن إصدار Windows 9x ، 2000 ، و XP من مربع الحوار المشترك الذي تم تخزينه لكل عنصر في بيانات LVITEM (الائتمان الأصلي إلى Paul Dilascia):

lpcitemidlist pidlitem = (lpcitemidlist) plistctrl-> getItemData (nitem) ؛

ومع ذلك ، بدءا من الضوابط المشتركة لـ Vista وما فوق ، تفشل هذه التقنية :(

أي أفكار؟

تحرير: يجب أن أكون قادرًا على الحصول على هذه المعلومات ليس فقط للعنصر المحدد حاليًا في عرض القائمة ، ولكن لجميع العناصر في عرض القائمة.

EDIT2: السبب في أنني بحاجة إلى الحفر عميقًا:

في الإصدارات السابقة من تطبيقنا ، نقدم القدرة على: (1) اضغط على زر مخصص "معاينة" يغلق مربع الحوار ، ولكن ينقل إلى التطبيق قائمة العناصر المعروضة حاليًا في العرض ، بترتيبها المرئي ، إلى جانب فهرس واحد يسلط الضوء حاليا. يجب أن تكون هذه القائمة محددة بالكامل - رؤية 3 ملفات هي "J1329192" (عندما يكون هناك بالفعل 3 ملفات "J1329192.XYZ" "J1329192.xzy" و "J1329192.zyx" [بهذا الترتيب) غير مفيدة.

يُسمح للمستخدمين بكتابة مرشح اسم الملف الجزئي في الحقل "اسم الملف:" ، وسيعرض مربع الحوار المشترك فقط الملفات التي تتطابق مع المرشح الجزئي المعطى ، في الترتيب الذي اختاره المستخدم. لذا ، لإبلاغ التطبيق مرة أخرى إلى التطبيق بالضبط ما يريده المستخدم معاينته ، يتطلب أن نتمكن من الاستعلام عن هذه المعلومات من التحكم في عرض القائمة (أو مربع الحوار المشترك نفسه).

نقوم بإجراء تحسينات أخرى على مربع حوار الملف أيضًا-بما في ذلك جزء معاينة في مكان يوضح الاختيار الحالي للمستخدم باعتباره صورة مصغرة ، وكذلك واجهة مخصصة للأماكن الحديثة ، وما إلى ذلك. كان كل هذا ممكنًا (مع الكثير من العمل) قبل Vista. بعد فيستا ، ركضت على الحائط على الحائط. في الوقت الحالي ، نستخدم مربع حوار ملف قياسي مع عدد قليل جدًا من الميزات الخاصة بنا ، والتي لا تجلس بشكل جيد مع العملاء (ماذا حدث للميزات X؟!)

هناك تحسينات أخرى ، لكن هذه نظرة عامة جيدة. وكلهم يتلخصون في طلب معرفة "حقًا ، بصراحة ، ما هو الملف على وجه التحديد في العرض في الفهرس X؟" ولأسباب غير معروفة - لا يبدو أن Microsoft تشعر بالحاجة إلى توفير مثل هذه الواجهة. في الواقع لم يفعلوا ذلك. فقط من خلال بعض القرصنة والهندسة العكسية ، تمكنا من معرفة كيفية عمل الأشياء تحت غطاء محرك السيارة والحصول على المعلومات المطلوبة. ونعم ، هذا غير مدعوم ، ونعم ، حتما MS كودنا. أنا لا ألومهم حقًا على ذلك - ما أجده بغيضًا هو أن واجهةهم الأحدث والاسكتلن أكثر إغلاقًا من الواجهة القديمة - ولم يقدموا واجهات أكثر مقدمة - واجهات مدعومة - لإجراء تحسينات الحوار هذه . يبدو أنهم اتخذوا خطوات كبيرة من الخطوات إلى الوراء - ولا يوجد مهاجمين (باسم التقدم).

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

المحلول

يرسل WM_USER+7 للحصول على المتصفح ، ثم الحصول على واجهة Ishellview الخاصة بـ Shell View.

أنت تعرف النتيجة المعتادة لاستخدام السلوك غير الموثق ، أليس كذلك؟

نصائح أخرى

آه ، لقد وجدت ذلك. ستحتاج إلى استخدام IFileOpenDialog بالنسبة لـ Vista ، والتي يجب أن تدعم جميع تلك العمليات التي ذكرتها.

أعلم أن هذا خيط قديم ، لكن في Vista+، لا تزال الحوار على الطراز القديم مدعومًا. يمكنك إيقاف تشغيل أسلوب Vista والاحتفاظ بجميع عناصر التحكم المخصصة كما كان من قبل. هذا ما نقوم به: لدينا نافذة معاينة مخصصة في قالب مدمن على cfiledialog ، والذي يبدو أنه من المستحيل إعادة إنتاجه في Ifiledialog.

أعتقد أنك بحاجة إلى تمرير خطأ في معلمة Bool في المُنشئ لإيقاف تشغيل الحوار على طراز Vista.

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