كيف يمكنني إنشاء معالجات سياق Shell المخصصة لنظام التشغيل Windows؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

مشكلة

لغة:C#2.0 أو أحدث


أرغب في تسجيل معالجات السياق لإنشاء قوائم عندما ينقر المستخدم بزر الماوس الأيمن فوق ملفات معينة (في حالتي *.eic).ما هو الإجراء الخاص بالتسجيل وإلغاء التسجيل (التنظيف) والتعامل مع الأحداث (النقرات) من هذه القوائم؟

لدي فكرة أن الأمر يتعلق بسجل Windows، ولكن بالنظر إلى كمية الأشياء الموجودة في .net، لن أتفاجأ إذا كانت هناك طرق سهلة للقيام بذلك بطريقة نظيفة وسهلة.

مقتطفات التعليمات البرمجية، ومراجع الموقع، والتعليقات كلها جيدة.من فضلك ارمهم في وجهي.

تحديث


من الواضح أن هناك مشكلة بسيطة في إنشاء قوائم السياق باللغات المُدارة، كما علق العديد من المستخدمين.هل هناك أي طريقة مفضلة أخرى لتحقيق نفس السلوك، أم هل يجب علي قضاء بعض الوقت في البحث في هذه الحلول؟لا أمانع القيام بذلك على الإطلاق، ويسعدني أن الناس بذلوا جهدًا لجعل هذا ممكنًا - ولكن ما زلت أريد أن أعرف ما إذا كانت هناك طريقة "مناسبة/نظيفة" لتحقيق ذلك.

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

المحلول

قاوم كتابة ملحقات Shell باللغات المُدارة - هناك العديد من الأشياء التي يمكن أن تحدث فرقًا إذا اتبعت هذا الطريق.

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

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/1428326d-7950-42b4-ad94-8e962124043e/

لقد عدت إلى C/C++ غير المُدارة باعتبارها أدواتك الحقيقية الوحيدة هنا.

نصائح أخرى

هذه ليست فكرة جيدة بسبب وجود مشكلات التبعية المحتملة بين الإصدارات المختلفة من .NET Framework.يمكن أن يتوقع ملحق Shell الخاص بك إصدارًا واحدًا، بينما قد يكون تم بالفعل تحميل إصدار مختلف بواسطة التطبيق قيد التشغيل حاليًا.

هذا الموضوع يحتوي على ملخص جيد للحالة.

في حين ذكر آخرون بالفعل أن كتابة امتدادات الصدفة في .NET النقي فكرة سيئة بسبب تعارضات إطار العمل، فلا يزال يتعين عليك ملاحظة ما يلي:

  1. توجد برامج تشغيل تابعة لجهات خارجية (انظر Eldos أو LogicNP) تقوم بالجانب غير المُدار نيابةً عنك، مما يسمح لك بكتابة تعليمات برمجية مُدارة تتحدث إلى برنامج التشغيل الأصلي، وبالتالي منع تعارضات إصدار CLR المرتبطة بـ Shell.

  2. ذكرت مقالة MSDN حديثة أن Microsoft قامت بحل هذه المشكلة لـ CoreCLR، كما يستخدمها Silverlight.لقد أنجزوا ذلك من خلال السماح بتشغيل إصدارات متعددة من CLR في نفس العملية، وبالتالي حل المشكلة.وذكر المؤلف أيضًا أن هذا الإصلاح في Silverlight سيتم تطبيقه في الإصدارات المستقبلية من CLR الكامل.(بمعنى أنه سيكون من الممكن في المستقبل كتابة امتدادات الصدفة في التعليمات البرمجية المُدارة.)

لقد قمت بها من قبل في C#.وينتهي الأمر بجحيم أصعب بكثير مما ينبغي.بمجرد حصولك على الكود المعياري، سيكون من السهل طرح عناصر جديدة.لقد اتبعت هذا الرابط:

رابط للمعلومات

كما ذكرت التعليقات السابقة، ليست الفكرة الأفضل أن تكتب امتدادات الصدفة باللغات المُدارة، لكنني أعتقد أنني سأشارك مشروعًا مفتوح المصدر يفعل ذلك تمامًا :)

ShellGlue هو امتداد Shell مُدار وهو في الواقع مفيد جدًا.قد يكون المصدر مفيدًا لك أيضًا إذا كنت مهتمًا بمتابعة كتابة ملحق Shell في C/C++.

بصرف النظر عن التحذيرات التي تم ذكرها فيما يتعلق بتنفيذ ملحقات Shell في التعليمات البرمجية المُدارة، ما عليك القيام به أساسًا هو ما يلي:

أولاً، قم بإنشاء مكون COM في C# الذي يقوم بتطبيق واجهات IShellExtInit IContextMenu.تم شرح كيفية إنشاء مكونات COM في C# هنا.كيفية تنفيذ الواجهات الضرورية موصوفة في هذا المقال.على الرغم من أن الوصف مخصص لتطبيق C++، إلا أنه يمكنك تطبيق هذه المعرفة على إصدار C# الخاص بك.

سيكون لمكون COM الخاص بك GUID يسمى Class-ID أو CLSID.تحتاج إلى تسجيل هذا المعرف بنوع الملف الخاص بك كملحق Shell لقائمة السياق:

HKEY_CLASSES_ROOT\.eic\ShellEx\ContextMenuHandlers\MyShellExt
    (Default) -> {YOUR-COMPONENTS-CLSID}

تأكد أيضًا من تسجيل المكون الخاص بك بشكل صحيح كما هو موضح في البرنامج التعليمي لـ C# COM.يجب أن تجده في التسجيل تحت

HKEY_CLASSES_ROOT\CLSID\{YOUR-COMPONENTS-CLSID}
    InprocServer32
        (Default) -> C:\WINDOWS\system32\mscoree.dll
        Class -> YourImplClass
        assembly -> YourAssembly, version=..., Culture=neutral, PublicKey=...
        ...

حظ سعيد...

وكما أشار آخرون، فإن امتدادات الصدفة ليست عملية في تطوير النوافذ حاليًا.

لقد طرحت سؤالا مماثلا مؤخرا والذي تم الرد عليه برابط إلى دليل للقيام بما أردت القيام به بالضبط

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