如何枚举所有可以以纯文本形式打开 XML 文件的程序?

How to enumerate all programs that can open XML file as plain text?

我正在编写一些代码,可以从 SQL 数据库中导入一些 XML。

有时我想使用 .xmlImportxml 方法将其导入 Excel 中,而其他时候我只想在文本编辑器中打开它。

我在带有复选框的框架内设置了 2 个选项按钮。该复选框确定我是要导入还是只查看 XML 文件。 2 个选项是使用文本编辑器或使用系统默认值 ShellExecute API。我不太喜欢这个选项,因为它通常是 Internet Explorer。看起来不错,但您无法编辑文件。

我想做的是枚举所有可用于查看系统上的纯文本文件的程序。我想将它们全部添加到框架内的组合框中。我曾经只是使用 shell 硬编码 Notepad 来启动它,但现在我正在使用 Notepad++ 我想拥有无需硬编码即可使用它的选项。有些用户使用 TextPad,有些用户使用 UltraEdit,有些用户使用 WordPad,等等。我可以编写所有代码我能想到的,但我更愿意动态地列举它们。

我已经检查过注册表,但那里没有任何一致的地方。我可以使用:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.txt\OpenWithList

找到列表,但我还没有找到从中获取路径的好方法。

如何获取在 OpenWithList 中为 .txt 个文件找到的所有可执行文件的路径?

或者是否有更好的方法来找出安装了哪些应用程序(文本编辑器)来查看和编辑文本文件,就像 XML 文件一样?

确实很难找出安装的应用程序中哪些适合编辑XML文件,即文本编辑器。

在 Windows Explorer 管理的 FileExts 列表中自动评估 .txtOpenWithList 是个好主意。但是这个列表只包含没有路径的可执行文件的文件名。

完整路径的可执行文件可以从以下位置读取:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths

在 Windows x64 上还有:

HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\App Paths

这些注册表项包含已安装应用程序的列表。每个可执行文件在 App Paths 下面都有一个键。每个应用程序密钥的默认字符串是具有完整路径的可执行文件的文件名。通常也存在的 Path 字符串是可选的,因此并不总是存在。

所有定期安装的应用程序都列在 App Paths 下,Notepad 除外。但是 Notepad 总是分别存在于目录 %windir% 中的 Windows 上 %SystemRoot%。因此通过获取环境变量 windirSystemRoot 的值,可以确定 Notepad 的完整文件名通过代码轻松实现。

唯一未在 App Paths 下列出的应用程序是那些刚刚复制到硬盘或从存档文件中提取而没有 运行 安装程序的应用程序。但是文本编辑器通常是通过安装程序安装的,而不是通过将文本编辑器的所有程序文件复制或提取到目录中来安装的。

根据 Microsoft 文章 Registry Keys Affected by WOW64

Microsoft\Windows\CurrentVersion\App Paths 自 Windows 7 和 Windows Server 2008 R2 以来 shared。这意味着两个注册表路径具有相同的数据库。因此,在两个 App Paths 中的任何一个中所做的每个修改都会自动立即在另一个路径上可见。从 HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths 读取适用于 x86 和 x64 应用程序。

但注册表项 Microsoft\Windows\CurrentVersion\App Paths 只是 重定向 在 x64 版本的 Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP。这意味着读取 HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths 的 x86 应用程序实际读取 HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\App Paths 仅包含 x86 应用程序,而 x64 应用程序实际读取 HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths 包含 x64 应用程序。

在 x64 Windows 上使用哪种策略来查找应用程序路径因此不容易选择。我建议先在 HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths 中搜索可执行文件。如果无法在 OpenWithList 中找到可执行文件名称,则应在 HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\App Paths 上进行第二次读取尝试。如果机器是 运行 Windows x86.

,则在 query/read 上访问只会出现 not found

Microsoft 文章 Application Registration 解释了应用程序的注册。正如可以在那里阅读的那样,当用户没有管理员权限时,用户也可以仅为当前用户安装应用程序。在这种情况下,应用程序在

下注册
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\App Paths

和 Windows x64 之前 Windows 7 和 Windows Server 2008 R2 可能仅在

HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\App Paths

还应从 OpenWithList.

中搜索这 2 个注册表路径以查找可执行文件的名称

顺便说一句:Windows 命令行解释器的命令 start 也使用 App Paths 注册表项来查找要启动的应用程序,请参阅 Where is “START” searching for executables?


我建议另外添加一个复选框选项记住我的选择,这样用户就可以select仅在首选viewer/editor申请XML 文件。如果曾经 selected 的应用程序仍然存在于记住的目录中,则之前使用此复选框时,您的应用程序应该在下次打开对话框时预select 适当的应用程序。

另一个复选框选项可以是 始终使用 selected 应用程序 选中一次会导致下次自动打开 XML 文件selected 应用程序不显示 select 应用程序 viewing/editing XML 文件的对话框,如果曾经 selected 的应用程序仍然存在于记住的目录中。