c# - 将文件扩展名关联到 C# 应用程序中的应用程序

标签 c# .net wpf file registerhotkey

我需要将文件扩展名关联到特定的可执行应用程序并将其值写入寄存器,所以我看到了这个教程: tutorial

所以我创建了一个新的 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);

dem

所以我需要知道

  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>

或者如果应用程序必须在每次启动时不请求管理员权限的情况下工作,请添加 self 提升的能力,如本例所示 UAC self-elevation

关于c# - 将文件扩展名关联到 C# 应用程序中的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21545580/

相关文章:

.net - 按钮的默认背景颜色

c# - 在 asp.net-core MVC 应用程序上需要 DocumentDB

c# - HTML5 和 CSS3 可以与 C#6.0 一起使用吗?

.net - MySqlCommand 参数不起作用

wpf - 如何为 WPF 创建矢量图像

c# - KeyDown、KeyUp 和 KeyPressed 不会在托管 WPF 控件的 WinForms 应用程序上触发

c# - 如何最好地在 C# ASP.Net 中加扰或隐藏获取查询字符串值?

c# - 如何在 Windows 窗体应用程序中使用 c Sharp 下载 azure blob 快照

.net - MVC3 路由 : passing a portion of the route as a "path" parameter

c# - 确定系统架构