Winapi 查找特定文件扩展名的默认应用程序(即使由metro应用程序提供服务)

Winapi 查找特定文件扩展名的默认应用程序(即使由metro应用程序提供服务),winapi,windows-8,windows-7,microsoft-metro,windows-8.1,Winapi,Windows 8,Windows 7,Microsoft Metro,Windows 8.1,如何找到特定文件扩展名的默认应用程序 这似乎因windows的版本而异,但是我发现最好的选择似乎是在shlwapi中使用AssocQueryString,它似乎对某些类型的应用程序非常有效 但是,它在Windows8中失败,可能是因为默认的pdf查看器中有一个metro“应用程序” 我想知道的原因是,如果存在默认应用程序,我可以为给定文件启动默认应用程序。 -否则,我很乐意给出一条消息:“文件已经生成,但您没有安装用于显示它的查看器。”答案是使用os.startfile(在python中),它似

如何找到特定文件扩展名的默认应用程序

这似乎因windows的版本而异,但是我发现最好的选择似乎是在shlwapi中使用AssocQueryString,它似乎对某些类型的应用程序非常有效

但是,它在Windows8中失败,可能是因为默认的pdf查看器中有一个metro“应用程序”

我想知道的原因是,如果存在默认应用程序,我可以为给定文件启动默认应用程序。
-否则,我很乐意给出一条消息:“文件已经生成,但您没有安装用于显示它的查看器。”

答案是使用os.startfile(在python中),它似乎相当于ShellExecute(和ShellExecuteEx),尽管有一个简化的界面

try:
    os.startfile(r'abspath/to/file', 'open)
except WindowsError:
    os.startfile(r'abspath/to', 'open') # Fallback to opening directory.

感谢Jonathan和David,他们认为最初寻找应用程序路径的方法在metro应用程序中不再可行。事实证明,应用程序路径并不是非常重要。

不幸的是,我认为metro文件关联系统还没有暴露于桌面应用程序中。@JonathanPotter:如果你能提供一种解决方法,例如,我可以确定给定的文件扩展名绝对没有关联的查看器,然后我愿意接受类似的回答,特别是如果你也提到了MSDN或类似的网站。使用ShellExecuteEx启动它,并对该函数的错误报告做出响应。