Maison >développement back-end >C++ >Comment déterminer par programme l'application par défaut pour ouvrir un type de fichier sous Windows ?

Comment déterminer par programme l'application par défaut pour ouvrir un type de fichier sous Windows ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-05 01:26:40682parcourir

How to Programmatically Determine the Default Application for Opening a File Type in Windows?

Détermination de l'application par défaut pour ouvrir un type de fichier sous Windows

L'ouverture de fichiers avec l'application par défaut appropriée est une tâche courante pour de nombreuses applications. Pour y parvenir dans .NET Framework 2.0 à l’aide de C#, vous pouvez utiliser la méthode System.Diagnostics.Process.Start. Cependant, cette méthode nécessite l'extension exacte du fichier pour déterminer l'application par défaut.

Pour ouvrir des fichiers sans extension spécifique dans l'application par défaut souhaitée, vous devez récupérer l'application associée au type de fichier. Bien que l'utilisation du registre pour déterminer cette association soit une approche peu fiable, l'API Win32 fournit une méthode plus robuste.

La fonction AssocQueryString de la bibliothèque Shlwapi.dll vous permet d'interroger l'association pour un type de fichier spécifique. À l'aide de cette fonction, vous pouvez déterminer la commande par défaut, l'exécutable ou d'autres informations pertinentes pour le type de fichier.

L'exemple d'utilisation montre comment utiliser AssocQueryString pour obtenir la commande associée à une extension de fichier :

using System;
using System.Runtime.InteropServices;

namespace FileAssociation
{
    class Program
    {
        [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);

        public enum AssocF
        {
            None = 0x00000000,
            Init_NoRemapCLSID = 0x00000001,
            Init_ByExeName = 0x00000002,
            Open_ByExeName = 0x00000002,
            Init_DefaultToStar = 0x00000004,
            Init_DefaultToFolder = 0x00000008,
            NoUserSettings = 0x00000010,
            NoTruncate = 0x00000020,
            Verify = 0x00000040,
            RemapRunDll = 0x00000080,
            NoFixUps = 0x00000100,
            IgnoreBaseClass = 0x00000200,
            Init_IgnoreUnknown = 0x00000400,
            Init_Fixed_ProgId = 0x00000800,
            Is_Protocol = 0x00001000,
            Init_For_File = 0x00002000
        }

        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
        }

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

            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();
        }

        public static void Main(string[] args)
        {
            string extension = ".txt";
            string command = AssocQueryString(AssocStr.Command, extension);
            System.Diagnostics.Process.Start(command, "test.txt");
        }
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn