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

我正在处理一些将从SQL数据库导入一些XML的代码。

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

我用一个checkbox在框架内设置了2个选项button。 该checkbox决定是否要导入或仅查看XML文件。 这两个选项是使用文本编辑器或使用ShellExecute API使用系统默认值。 我不喜欢这个选项,因为它通常是Internet Explorer 。 它看起来不错,但你不能编辑文件。

我想要做的是枚举所有可用于查看系统上的纯文本文件的程序。 我想把它们全部添加到框架内的combobox中。 我以前只是用记事本硬编码使用shell来启动它,但现在我使用记事本++ ,我想有没有硬编码任何使用它的选项。 一些用户使用TextPad ,一些使用UltraEdit ,一些使用写字板等。我可以编写所有我能想到的,但我更愿意dynamic枚举它们。

我已经通过registry检查,但没有任何一致的地方。 我可以用:

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

find名单,但我还没有find一个好办法,从中获得path。

如何获得在OpenWithListfind的.txt文件的所有可执行文件的path?

还是有更好的方法来找出哪些应用程序(文本编辑器)安装的查看和编辑文本文件也是XML文件?

确定哪个已安装的应用程序适合编辑XML文件(即文本编辑器)确实很难。

通过Windows资源pipe理器托pipe的FileExts列表自动评估.txtOpenWithList是一个好主意。 但是这个列表只包含没有path的可执行文件的文件名。

具有完整path的可执行文件可从

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

在Windows x64上还有:

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

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

所有定期安装的应用程序都列在“ App Paths ,但记事本除外。 但记事本总是存在于目录%windir%%SystemRoot% Windows中。 因此,通过获取环境variableswindirSystemRoot的值,可以通过代码轻松确定记事本的完整文件名。

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

Microsoft\Windows\CurrentVersion\App Paths是Windows 7和Windows Server 2008 R2根据Microsoft Article 受WOW64影响的registry键 共享的 。 这意味着两个registrypath具有相同的数据库。 因此,在两个App Paths中的任何一个中进行的每个修改都会自动立即在另一个path中可见。 从HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths读取适用于x86和x64应用程序。

但是registry项Microsoft\Windows\CurrentVersion\App Paths仅在Windows Server 2008,Windows Vista,Windows Server 2003和Windows XP的x64版本上redirect 。 这意味着一个x86应用程序读取HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths真正的HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\App Paths只包含x86应用程序,而x64应用程序真正读取HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths包含x64应用HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths

因此,用于在x64 Windows上查找应用程序path的策略是不容易select的。 我build议首先在HKLM\Software\Microsoft\Windows\CurrentVersion\App Pathssearch一个可执行文件。 如果OpenWithList的可执行文件的名字在那里找不到,应该在HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\App Paths上进行第二次读取尝试。 在查询/读取访问时,如果计算机运行的是Windows x86,则不会发生超过未find的情况。

微软文章应用程序注册解释了应用程序的注册 因为它可以被读取,所以当用户没有pipe理员权限时,用户也可以为当前用户安装应用程序。 在这种情况下,申请已经注册

 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 

这两个registrypath也应该从OpenWithListsearch可执行文件的名字。

顺便说一下:Windows命令行解释器的命令启动也使用App Pathsregistry键来查找要启动的应用程序,请参阅“START”search可执行文件的位置在哪里?


我还build议使用checkbox选项记住我的select ,以便用户只能select一次首选的查看器/编辑器应用程序的XML文件。 如果一次select的应用程序仍然存在于记忆的目录中,则应用程序应该在对话框的下一次打开时预先select适当的应用程序。

如果一次select的应用程序仍然存在,则另一个checkbox选项可以是总是使用选定的应用程序 ,而在一次select的应用程序中自动导致下次打开XML文件时不显示对话框以select用于查看/编辑XML文件的应用程序在被记住的目录。