使用Windows API获取文件关联

我正在使用C ++的基于控制台的Windows文件浏览器,并且难以将上下文菜单放在一起,该菜单列出与文件关联的操作并在其上调用命令。 现在最大的问题是获取与文件types相关的操作。

我知道打开和调整HKEY_CLASSES_ROOT中的registry项的过程,但我找不到实际获取操作和命令的方法,因此我可以从中创build上下文菜单。

这些协会在registry中的一般结构是:

HKEY_CLASSES_ROOT \(扩展名)\(默认) – 文件types
HKEY_CLASSES_ROOT \ filetype \(默认) – 文件types的说明
HKEY_CLASSES_ROOT \ filetype \ shell \ action \(默认) – 操作的描述
HKEY_CLASSES_ROOT \ filetype \ shell \ action \ command \(默认) – 在文件上调用的命令

我想知道是否有一种方法(希望使用Windows API),我可以得到所有与文件types相关的操作。 至less我可以在registry中检查这些操作

此外,这种方法似乎不适用于我的系统上的一些常见的文件types(例如MP3),因为默认键是空白的,另一个键(“PercievedType”)设置为audio…我怎样才能得到的行动对于这样的事情?

最后,如果有更好的方法来做到这一点,我一般很喜欢听到它,我通常讨厌处理registry。 我宁愿有一个简单的Windows调用,将使我的行动和命令…

考虑使用IContextMenu 。 IContextMenu是Windows资源管理器如何访问文件和项目的上下文菜单。

本文由Raymond Chen提供了如何访问给定文件路径的IContextMenu的示例代码,并使用它来用一组可用命令填充HMENU。 这是一系列文章中的第一篇 ,它们给出了一个体面的概述以及示例代码。

试试这个(为简洁起见,省略了错误处理):

TCHAR szBuf[1000]; DWORD cbBufSize = sizeof(szBuf); HRESULT hr = AssocQueryString(0, ASSOCSTR_FRIENDLYAPPNAME, argv[1], NULL, szBuf, &cbBufSize); if (FAILED(hr)) { /* handle error */ } CStringA strFriendlyProgramName(szBuf, cbBufSize); cbBufSize = sizeof(szBuf); hr = AssocQueryString(0, ASSOCSTR_EXECUTABLE, argv[1], NULL, szBuf, &cbBufSize); if (FAILED(hr)) { /* handle error */ } CStringA strExe(szBuf, cbBufSize); std::cout << strFriendlyProgramName << " (" << strExe << ")" << std::endl;