2010-08-21 85 views
2

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

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

在注册表这些关联的一般结构是:

HKEY_CLASSES_ROOT \(延伸)\(缺省) - 对文件类型
HKEY_CLASSES_ROOT \文件类型\(缺省) - 文件类型
HKEY_CLASSES_ROOT \的描述文件类型\壳\动作\(缺省) - 动作
HKEY_CLASSES_ROOT \文件类型\壳\动作\命令\(默认值)的说明 - 命令调用上文件

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

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

最后,如果有更好的方法来做到这一点,我一般很想听到它,我通常讨厌处理注册表。我宁愿有一个简单的Windows调用,将让我的动作和命令......

回答

2

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

This article作者:Raymond Chen有关如何访问给定文件路径的IContextMenu的示例代码,并使用它来用一组可用命令填充HMENU。这是series of articles中的第一个,它给出了一个体面的概述以及示例代码。

+0

谢谢!这正是我希望能做到的!这篇文章帮助了很多! – 2010-08-24 16:50:41

6

尝试(使用错误省略为简洁起见)这样的:

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; 
+0

无论谁决定在Windows 8及更高版本上使用它,请谨慎使用。在没有文件关联的情况下返回的可执行路径是'C:\ WINDOWS \ system32 \ OpenWith.exe'。 – c00000fd 2016-02-07 04:48:43

+0

@ c00000fd,在Windows 7或更高版本中,可以使用标志['ASSOCF_INIT_IGNOREUNKNOWN'](https://msdn.microsoft.com/zh-cn/library/bb762471)避免使用默认的openwith.exe。 – eryksun 2017-09-25 03:45:03