3

我正在使用 C++ 为 Windows 开发基于控制台的文件浏览器,并且很难将上下文菜单组合在一起,该菜单列出与文件关联的操作并在它们上调用命令。目前最大的问题是将操作与文件类型相关联。

我知道在 HKEY_CLASSES_ROOT 中打开和调整注册表项的过程,但我找不到实际获取操作及其命令的方法,因此我可以从中构建上下文菜单。

注册表中这些协会的一般结构是:

HKEY_CLASSES_ROOT\(extension)\(default) - 文件类型
HKEY_CLASSES_ROOT\filetype\(default) - 文件类型描述
HKEY_CLASSES_ROOT\filetype\shell\action\(default) - 操作描述
HKEY_CLASSES_ROOT\filetype\shell\action\command\(默认) - 对文件调用的命令

我想知道是否有一种方法(希望使用 Windows API)可以获得与文件类型相关的所有操作。至少我可以在注册表中检查这些操作的命令......

此外,这种方法似乎不适用于我系统上的一些常见文件类型(例如 mp3),因为默认键留空,另一个键(“PercievedType”)设置为音频......我怎样才能得到这些动作对于这样的事情?

最后,如果有更好的方法来做到这一点,我很乐意听到它,我通常讨厌与注册表打交道。我宁愿有一个简单的 Windows 调用,它可以让我得到动作和命令......

4

2 回答 2

8

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

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;
于 2010-08-21T07:14:11.873 回答
2

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

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

于 2010-08-21T17:05:02.700 回答