c# - 如何在 Windows 上正确检索与扩展关联的打开命令?

标签 c# c++ winapi windows-shell

我正在尝试找出用于打开给定扩展名文件的可执行文件,以便在扩展名没有时显示该可执行文件的图标。

我知道该文件类型的 HKEY_CLASSES_ROOT 注册表项中的开放动词,但我发现它的值并不总是正确的。

例如,我目前在 OS X 上的 Parallels 中运行 Windows。PDF 文件的默认关联是 Safari。我通过资源管理器将默认关联更改为 Adob​​e Reader。注册表中的打开动词仍然是 Safari,但是当我双击 PDF 文件时,它会使用 Adob​​e Reader 打开。 32 位和 64 位注册表具有相同的值。

是否有更好的方法来检索文件类型的关联,无论是使用 .NET 还是 winapi?

最佳答案

您最好的选择可能是使用 Assoc* 函数组,例如 AssocQueryKey()AssocQueryString() via PInvoke .但是,我不知道 .NET Framework 附带的许多类中的一个是否已经为您包装了它。但是 Shell API 为您提供了检索此信息的选项。

另请注意备注部分,其中声明上述函数是 IQueryAssociations 的包装器接口(interface),这使您更有可能通过另一条更直接的途径从 .NET 中获得您想要的内容。

旧式函数是这个:FindExecutable() .不过,不要使用它。它使用与 ShellExecute() 相同的有缺陷的错误代码魔法。

另请参阅 Windows: List and Launch applications associated with an extension 的答案

关于c# - 如何在 Windows 上正确检索与扩展关联的打开命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13461236/

相关文章:

c++ - 我如何知道 HWND 是否是桌面本身?

c# - 在泛型类型定义中使用 'params' 的方法

c# - 为构建轮询 Microsoft.VisualStudio.Services.Client 时出现 NullReferenceException

c# - 如何检查当前代码是否为 "inside"锁?

c++ - fprintf 不能在 C++ 中使用 switch/case 语句

c# - 使用 SetParent 窃取另一个进程的主窗口但保持消息循环独立

c# - 从文件中读取字节

c++ - `(void)d`的用途是什么

c++ - 为什么代码会主动尝试阻止尾调用优化?

c - 使用 fopen_s 将文件保存在 "Program Files/myApplication"文件夹中