ホームページ >バックエンド開発 >C++ >Windows でファイルの種類を開くためのデフォルトのアプリケーションをプログラムで決定する方法

Windows でファイルの種類を開くためのデフォルトのアプリケーションをプログラムで決定する方法

Susan Sarandon
Susan Sarandonオリジナル
2025-01-05 01:26:40722ブラウズ

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

Windows でファイル タイプを開くためのデフォルト アプリケーションを決定する

適切なデフォルト アプリケーションでファイルを開くことは、多くのアプリケーションにとって共通のタスクです。 C# を使用して .NET Framework 2.0 でこれを実現するには、System.Diagnostics.Process.Start メソッドを利用できます。ただし、この方法では、デフォルトのアプリケーションを決定するために正確なファイル拡張子が必要です。

目的のデフォルト アプリケーションで特定の拡張子のないファイルを開くには、ファイルの種類に関連付けられたアプリケーションを取得する必要があります。レジストリを使用してこの関連付けを判断する方法は信頼性が低いですが、Win32 API はより堅牢な方法を提供します。

Shlwapi.dll ライブラリの AssocQueryString 関数を使用すると、特定のファイル タイプの関連付けをクエリできます。この関数を使用すると、ファイル タイプのデフォルトのコマンド、実行可能ファイル、またはその他の関連情報を決定できます。

使用例では、AssocQueryString を利用してファイル拡張子に関連付けられたコマンドを取得する方法を示します。

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

以上がWindows でファイルの種類を開くためのデフォルトのアプリケーションをプログラムで決定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。