2010-08-21 88 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