如何确定与特定扩展相关联的应用程序(例如.JPG),然后确定该应用程序的可执行文件所在的位置,以便可以通过调用System.Diagnostics.Process.Start(...)来启动它。

我已经知道如何读写注册表了。 注册表的布局使得更难以以标准方式确定哪些应用程序与扩展相关联,哪些显示名称以及它们的可执行文件所在的位置。

===============>>#1 票数:8 已采纳

示例代码:

using System;
using Microsoft.Win32;

namespace GetAssociatedApp
{
    class Program
    {
        static void Main(string[] args)
        {
            const string extPathTemplate = @"HKEY_CLASSES_ROOT\{0}";
            const string cmdPathTemplate = @"HKEY_CLASSES_ROOT\{0}\shell\open\command";

            // 1. Find out document type name for .jpeg files
            const string ext = ".jpeg";

            var extPath = string.Format(extPathTemplate, ext);

            var docName = Registry.GetValue(extPath, string.Empty, string.Empty) as string;
            if (!string.IsNullOrEmpty(docName))
            {
                // 2. Find out which command is associated with our extension
                var associatedCmdPath = string.Format(cmdPathTemplate, docName);
                var associatedCmd = 
                    Registry.GetValue(associatedCmdPath, string.Empty, string.Empty) as string;

                if (!string.IsNullOrEmpty(associatedCmd))
                {
                    Console.WriteLine("\"{0}\" command is associated with {1} extension", associatedCmd, ext);
                }
            }
        }
    }
}

===============>>#2 票数:8

像Anders说的那样 - 使用IQueryAssociations COM接口是个好主意。 这是来自pinvoke.net样本

===============>>#3 票数:4

@aku:别忘了HKEY_CLASSES_ROOT \\ SystemFileAssociations \\

不确定它们是否在.NET中公开,但是有COM接口(IQueryAssociations和朋友)处理这个,所以你不必在注册表中捣乱并希望在下一个Windows版本中没有改变的东西

===============>>#4 票数:1

还有HKEY_CURRENT_USER \\ Software \\ Microsoft \\ Windows \\ CurrentVersion \\ Explorer \\ FileExts \\

EXT \\ OpenWithList键为“Open width ...”列表('a','b','c','d'等选项的字符串值)

EXT \\ UserChoice键为“始终使用所选程序打开此类文件”('Progid'字符串值值)

所有值都是键,使用方法与上中的docName相同。

===============>>#5 票数:0

文件类型关联存储在Windows注册表中,因此您应该能够使用Microsoft.Win32.Registry类来读取以哪种文件格式注册的应用程序。

以下是两篇可能有用的文章:

  ask by Pauly translate from so

未解决问题?本站智能推荐:

3回复

奇怪的问题。 以Process.Start启动的应用程序在写入Windows注册表时给出UnauthorizedAccessException

我已经在.Net中编写了一个包装器应用程序,该应用程序使用指定的用户名和密码启动了另一个WinForms应用程序。 有关为什么需要执行此操作的背景信息,您可以查看我在本周早些时候发布的以下问题: 如何保护包含Access数据库的网络文件夹,同时仍允许WinForms应用程序连接到数据库
1回复

我的Windows服务从应用程序读取不同的注册表路径

我用C#写了一个ConsoleApplication,它的所有工作只是调用dll(Dynamic Link Libarary)的某些功能,而Init()是这些功能之一,它将读取注册表路径为HKEY_CURRENT_USER \\ Software \\ CompanyName \\ Config
4回复

Windows RegKey - 默认浏览器应用程序路径

RegKey可以从哪个版本获取默认浏览器应用程序的路径? 从C#/ .NET获取它的最佳方法是什么?
1回复

如何在Windows(8.1)中将自定义应用程序注册为Web浏览器?

我试图所以它出现在列表中,使用信息,我发现在Windows中选择AA默认浏览器中注册自己的应用程序周围 的 互联网 。 所有代码都可以正常运行,并且似乎可以创建正确的注册表项,但是我的应用程序未显示在Windows 8.1的“浏览器选择”选项中。 我还没有设置一些在线代码示例中显示的Us
1回复

启动.NET应用程序时由什么决定您的USERPROFILE环境变量

在运行VMWARE / Windows Server 2008的测试服务器上启动时,我有一个.net / C#应用程序,收到指向C:\\ windows \\ system32 \\ config \\ systemprofile的USERPROFILE环境变量,但其他应用程序似乎以类似的方式继
1回复

禁用Windows Shell扩展

我在Windows中具有以下注册表项,该注册表项为.NET应用程序生成了一个外壳上下文菜单: 当我在Windows中右键单击文件时,此扩展会产生一个上下文菜单选项。 我可以删除它,这将解决我的问题(删除MyShellExtension键将不再在右键单击文件时生成上下文菜单,这是我想要的
1回复

如何在没有WMI的情况下可靠地找到应用程序InstallLocation

我正在尝试查找是否已安装应用程序,以及安装路径是什么。 我尝试使用WMI Win32_SoftwareElement并枚举以下注册表项 HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall HKLM\\SOF
2回复

您可以从应用程序更改视觉效果性能设置吗?

我正在修改位于以下位置的注册表值: HKEY_CURRENT_USER \\软件\\微软\\的Windows \\ CurrentVersion \\ Explorer中\\ VisualEffects。 就我而言,它可以存储DWORD值0、1、2。这些值与Windows 7中“性能
1回复

Win32应用程序未出现在“开始”菜单搜索中

我已经构建了Win32应用程序,并且该应用程序是通过自定义NSIS安装脚本安装的。 该应用程序安装并执行没有问题。 但是,当我去搜索该应用程序或在程序列表(在Windows 10和Windows 7中)中找到该应用程序时,未列出该应用程序。 我假设我需要添加注册表值,但不确定。 我已经在
1回复

Windows重新启动后如何自动启动自己的可执行文件?

假设我有一个在Windows上运行的C#.NET 2.0+应用程序。 并且在某个特定时间点它会强制Windows重新启动。 Windows重新启动后,如何才能再次自动启动此应用程序以继续执行程序做一些工作? 我需要以某种方式在代码中执行此操作,但是我不知道如何执行。 向我指出,请提供一些