3

ファイル拡張子を特定の実行可能アプリケーションに関連付け、その値をレジスタに書き込む必要があるため、このチュートリアルを参照してください: チュートリアル

だから私はこのクラスを追加する新しいWpfアプリケーションを作成します:

public class FileAssociation
    {
        // Associate file extension with progID, description, icon and application
        public static void Associate(string extension,
               string progID, string description, string icon, string application)
        {
            Registry.ClassesRoot.CreateSubKey(extension).SetValue("", progID);
            if (progID != null && progID.Length > 0)
                using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(progID))
                {
                    if (description != null)
                        key.SetValue("", description);
                    if (icon != null)
                        key.CreateSubKey("DefaultIcon").SetValue("", ToShortPathName(icon));
                    if (application != null)
                        key.CreateSubKey(@"Shell\Open\Command").SetValue("",
                                    ToShortPathName(application) + " \"%1\"");
                }
        }

        // Return true if extension already associated in registry
        public static bool IsAssociated(string extension)
        {
            return (Registry.ClassesRoot.OpenSubKey(extension, false) != null);
        }

        [DllImport("Kernel32.dll")]
        private static extern uint GetShortPathName(string lpszLongPath,
            [Out] StringBuilder lpszShortPath, uint cchBuffer);

        // Return short path format of a file name
        private static string ToShortPathName(string longName)
        {
            StringBuilder s = new StringBuilder(1000);
            uint iSize = (uint)s.Capacity;
            uint iRet = GetShortPathName(longName, s, iSize);
            return s.ToString();
        }
    }

次に、アイコン画像をプロジェクトのルートに追加し、このスニペットを配置しました:

  if (!FileAssociation.IsAssociated(".akp"))
                FileAssociation.Associate(".akp", "ClassID.ProgID", "akp File", "akeo.ico", @"C:\Users\Lamloumi\Desktop\MyWork\C#\App - SuiteTool\bin\x64\Debug\App - SuiteTool.exe");

しかし、この行で問題が発生しました

Registry.ClassesRoot.CreateSubKey(extension).SetValue("", progID);

デム

だから私は知る必要があります

  1. 問題は何ですか、つまり、このコードが機能しなかった理由は何ですか?
  2. どうすれば修正できますか?

ありがとう、

4

1 に答える 1

2

Windows レジストリに書き込むための十分なアクセス許可がないようです。コンテンツを含むプロジェクト app.manifest ファイルに追加してみてください:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
          <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
            <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
          </requestedPrivileges>
        </security>
      </trustInfo>
</asmv1:assembly>

または、起動のたびに管理者権限を要求せずにアプリケーションが動作する必要がある場合は、この例の UAC 自己昇格に示すように、自己昇格する機能を追加します。

于 2014-02-04T07:04:21.867 に答える