如何枚举所有可以打开纯文本文件的程序?
我正在处理一些将从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。
如何获得在OpenWithList
find的.txt
文件的所有可执行文件的path?
还是有更好的方法来找出哪些应用程序(文本编辑器)安装的查看和编辑文本文件也是XML文件?
确定哪个已安装的应用程序适合编辑XML文件(即文本编辑器)确实很难。
通过Windows资源pipe理器托pipe的FileExts
列表自动评估.txt
的OpenWithList
是一个好主意。 但是这个列表只包含没有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的可执行文件的文件名。 通常也存在的Path
string是可选的,因此并不总是存在。
所有定期安装的应用程序都列在“ App Paths
,但记事本除外。 但记事本总是存在于目录%windir%
和%SystemRoot%
Windows中。 因此,通过获取环境variableswindir或SystemRoot的值,可以通过代码轻松确定记事本的完整文件名。
应用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 Paths
search一个可执行文件。 如果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也应该从OpenWithList
search可执行文件的名字。
顺便说一下:Windows命令行解释器的命令启动也使用App Paths
registry键来查找要启动的应用程序,请参阅“START”search可执行文件的位置在哪里?
我还build议使用checkbox选项记住我的select ,以便用户只能select一次首选的查看器/编辑器应用程序的XML文件。 如果一次select的应用程序仍然存在于记忆的目录中,则应用程序应该在对话框的下一次打开时预先select适当的应用程序。
如果一次select的应用程序仍然存在,则另一个checkbox选项可以是总是使用选定的应用程序 ,而在一次select的应用程序中自动导致下次打开XML文件时不显示对话框以select用于查看/编辑XML文件的应用程序在被记住的目录。