"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكنني ربط ملحق ملف برمجيًا بتطبيقي في Windows دون استخدام مثبت؟

كيف يمكنني ربط ملحق ملف برمجيًا بتطبيقي في Windows دون استخدام مثبت؟

نشر في 2025-04-08
تصفح:989

How can I programmatically associate a file extension with my application in Windows without using an installer?

ربط ملحقات الملف مع التطبيق

]]

عند تطوير التطبيقات التي تقوم بتحرير نوع ملف معين ، فمن الضروري عادة ربطه كمحرر افتراضي لنوع الملف هذا. فيما يلي حل موثوق لتحقيق ذلك دون استخدام المثبت.

تنفيذ طريقة الارتباط:

يحاول الكود المقدم من

ربط الملفات عن طريق معالجة السجل. ومع ذلك ، فإنه يحتوي على عدة أسئلة:
  1. يفتح سجل المستخدم الحالي دون تحديد أذونات القراءة والكتابة ، مما قد يمنع تعديل المفتاح بنجاح.
  2. يستخدم CreateSubKey بدلاً من OpenSubKey لإنشاء مفتاح فرعي shell ، والذي يفشل في حالة وجود مفتاح فرعي بالفعل.

رمز الارتباط المعدل:

فيما يلي نسخة معدلة من الكود الذي يحل هذه المشكلات:
public static void SetAssociation(string extension, string keyName, string fileDescription, string executablePath)
{
    // 以读写权限打开当前用户的注册表
    using (RegistryKey currentUser = Registry.CurrentUser.OpenSubKey(@"HKEY_CURRENT_USER", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl))
    {
        using (RegistryKey baseKey = currentUser.CreateSubKey(extension))
        {
            baseKey.SetValue("", keyName);
        }

        using (RegistryKey openMethodKey = currentUser.CreateSubKey(keyName))
        {
            openMethodKey.SetValue("", fileDescription);

            // 如果“DefaultIcon”子密钥不存在,则创建它
            if (openMethodKey.OpenSubKey("DefaultIcon") == null)
            {
                using (RegistryKey defaultIconKey = openMethodKey.CreateSubKey("DefaultIcon"))
                {
                    defaultIconKey.SetValue("", "\""   executablePath   "\",0");
                }
            }

            // 创建 Shell 子密钥并编辑和打开命令子密钥
            using (RegistryKey shellKey = openMethodKey.CreateSubKey("Shell"))
            {
                using (RegistryKey editKey = shellKey.CreateSubKey("edit"))
                {
                    using (RegistryKey editCommandKey = editKey.CreateSubKey("command"))
                    {
                        editCommandKey.SetValue("", "\""   executablePath   "\" \"%1\"");
                    }
                }

                using (RegistryKey openKey = shellKey.CreateSubKey("open"))
                {
                    using (RegistryKey openCommandKey = openKey.CreateSubKey("command"))
                    {
                        openCommandKey.SetValue("", "\""   executablePath   "\" \"%1\"");
                    }
                }
            }
        }

        // 在 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts 中设置 ProgId
        using (RegistryKey fileExtsKey = currentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\"   extension))
        {
            fileExtsKey.SetValue("Progid", keyName);
        }
    }

    // 通知资源管理器更改以刷新其文件关联
    SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH, IntPtr.Zero, IntPtr.Zero);
}

مثال للاستخدام:

لربط امتداد ملف .ucs بتطبيق يسمى "محرر UCS" ، يمكنك استخدام هذا الرمز:
SetAssociation(".ucs", "UCS_Editor_File", "UCS File", Application.ExecutablePath);

احتياطات أخرى:

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

تحافظ هذه الاستجابة المنقحة على الصورة الأصلية وتستخدم لغة وصفية أكثر مع إعادة هيكلة النص لتحسين الوضوح والتدفق. تم تنسيق الرمز أيضًا لتحسين قابلية القراءة.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3