العثور على التطبيق الافتراضي لفتح نوع ملف معين على نظام التشغيل Windows

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

  •  03-07-2019
  •  | 
  •  

سؤال

أقوم بتطوير تطبيق يستهدف .NET Framework 2.0 باستخدام لغة C# وأحتاج إلى أن أتمكن من العثور على التطبيق الافتراضي المستخدم لفتح نوع ملف معين.

أعلم أنه، على سبيل المثال، إذا كنت تريد فقط فتح ملف باستخدام هذا التطبيق، فيمكنك استخدام شيء مثل:

System.Diagnostics.Process.Start( "C:\...\...\myfile.html" );

لفتح مستند HTML في المتصفح الافتراضي، أو

System.Diagnostics.Process.Start( "C:\...\...\myfile.txt" );

لفتح ملف نصي في محرر النصوص الافتراضي.

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

أعتقد أن هناك بعض واجهات برمجة تطبيقات Win32 التي سأحتاج إلى P/استدعاء للقيام بذلك، ولكن نظرة سريعة مع كل من Google وMSDN لم تكشف عن أي شيء مثير للاهتمام؛لقد عثرت على عدد كبير جدًا من الصفحات التي لا صلة لها بالموضوع على الإطلاق، ولكن لا شيء يشبه ما أبحث عنه.

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

المحلول

ويمكنك الاختيار تحت التسجيل قسم HKEY_CLASSES_ROOT لتمديد والعمل على التفاصيل. ثائق هذه هي على MSDN . بدلا من ذلك، يمكنك استخدام واجهة IQueryAssociations .

نصائح أخرى

جميع الإجابات الحالية غير موثوقة.السجل عبارة عن تفاصيل تنفيذ وقد تم بالفعل كسر هذا الرمز على جهاز Windows 8.1 الخاص بي.الطريقة الصحيحة للقيام بذلك هي استخدام Win32 API، على وجه التحديد سلسلة AssocQuery:

using System.Runtime.InteropServices;

[DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
public static extern uint AssocQueryString(
    AssocF flags, 
    AssocStr str,  
    string pszAssoc, 
    string pszExtra, 
    [Out] StringBuilder pszOut, 
    ref uint pcchOut
); 

[Flags]
public enum AssocF
{
    None = 0,
    Init_NoRemapCLSID = 0x1,
    Init_ByExeName = 0x2,
    Open_ByExeName = 0x2,
    Init_DefaultToStar = 0x4,
    Init_DefaultToFolder = 0x8,
    NoUserSettings = 0x10,
    NoTruncate = 0x20,
    Verify = 0x40,
    RemapRunDll = 0x80,
    NoFixUps = 0x100,
    IgnoreBaseClass = 0x200,
    Init_IgnoreUnknown = 0x400,
    Init_Fixed_ProgId = 0x800,
    Is_Protocol = 0x1000,
    Init_For_File = 0x2000
}

public enum AssocStr
{
    Command = 1,
    Executable,
    FriendlyDocName,
    FriendlyAppName,
    NoOpen,
    ShellNewValue,
    DDECommand,
    DDEIfExec,
    DDEApplication,
    DDETopic,
    InfoTip,
    QuickTip,
    TileInfo,
    ContentType,
    DefaultIcon,
    ShellExtension,
    DropTarget,
    DelegateExecute,
    Supported_Uri_Protocols,
    ProgID,
    AppID,
    AppPublisher,
    AppIconReference,
    Max
}

الوثائق ذات الصلة:

استخدام العينة:

static string AssocQueryString(AssocStr association, string extension)
{
    const int S_OK = 0;
    const int S_FALSE = 1;

    uint length = 0;
    uint ret = AssocQueryString(AssocF.None, association, extension, null, null, ref length);
    if (ret != S_FALSE)
    {
        throw new InvalidOperationException("Could not determine associated string");
    }

    var sb = new StringBuilder((int)length); // (length-1) will probably work too as the marshaller adds null termination
    ret = AssocQueryString(AssocF.None, association, extension, null, sb, ref length);
    if (ret != S_OK)
    {
        throw new InvalidOperationException("Could not determine associated string"); 
    }

    return sb.ToString();
}

ودوه! بطبيعة الحال.

HKEY_CLASSES_ROOT\.txt

ويتضمن إشارة إلى

HKEY_CLASSES_ROOT\txtfile

والذي يحتوي على فرعي

HKEY_CLASSES_ROOT\txtfile\shell\open\command

والتي تشير المفكرة.

والترتيب، شكرا جزيلا!

وبارت

هنا هو بلوق وظيفة مع نحو هذا الموضوع. نماذج التعليمات البرمجية هي في VB.net، ولكن يجب أن يكون من السهل ميناء لهم C #.

ويمكنك فقط الاستعلام عن التسجيل. أولا الحصول على الإدخال الافتراضي تحت HKEY_CLASSES_ROOT \ .ext

وهذا سوف تعطيك اسم_الفئة. على سبيل المثال. TXT لديه الافتراضي txtfile سبيل

وبعد ذلك فتح HKEY_CLASSES_ROOT \ txtfile سبيل \ شل \ المفتوحة \ القيادة

وهذا سوف تعطيك الأمر الافتراضية المستخدمة.

<اقتباس فقرة>   

والجواب في وقت متأخر، ولكن هناك مجموعة جيدة NUGET الذي يعالج ملف الجمعيات: جمعية ملف

رابط NUGET جمعية ملف

واستخدام بسيط، على سبيل المثال لإضافة كافة الملحقات الملفات المسموح بها إلى قائمة السياق:

private void OnMenuSourceFileOpening(object sender, ...)
{   // open a context menu with the associated files + ".txt" files
    if (File.Exists(this.SelectedFileName))
    {
        string fileExt = Path.GetExtension(this.SelectedFileNames);
        string[] allowedExtensions = new string[] { fileExt, ".txt" };
        var fileAssociations = allowedExtensions
            .Select(ext => new FileAssociationInfo(ext));
        var progInfos = fileAssociations
            .Select(fileAssoc => new ProgramAssociationInfo (fileAssoc.ProgID));
        var toolstripItems = myProgInfos
            .Select(proginfo => new ToolStripLabel (proginfo.Description) { Tag = proginfo });
        // add also the prog info as Tag, for easy access
        //  when the toolstrip item is selected
        // of course this can also be done in one long linq statement

        // fill the context menu:
        this.contextMenu1.Items.Clear();
        this.contextMenuOpenSourceFile.Items.AddRange (toolstripItems.ToArray());
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top