2012-11-02 31 views
4

我正在建立關於filecontextmenu的dll,我需要在鼠標右鍵單擊時獲取執行路徑和快捷方式displaynem。現在我可以找到路徑,但不知道如何獲取顯示名稱。 EX:桌面上的IE快捷方式,我需要用戶可以編輯的名稱「IE」,而不是「iexplore.exe」。當鼠標右鍵單擊(C++/c#)時,如何獲得快捷方式顯示名稱

這裏是一個reference非常相似,但我無法找到我應該做的,當桌面

快捷方式,如果有任何建議,我將非常感激,這裏是我的代碼和感謝。

IFACEMETHODIMP FileContextMenuExt::Initialize(
LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDataObj, HKEY hKeyProgID) 

if (NULL == pDataObj) 
    return E_INVALIDARG; 

HRESULT hr = E_FAIL; 

FORMATETC fe = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; 
STGMEDIUM stm; 

// The pDataObj pointer contains the objects being acted upon. In this 
// example, we get an HDROP handle for enumerating the selected files and 
// folders. 
if (SUCCEEDED(pDataObj->GetData(&fe, &stm))) 
{ 
    // Get an HDROP handle. 
    HDROP hDrop = static_cast<HDROP>(GlobalLock(stm.hGlobal)); 

    if (hDrop != NULL) 
    { 
     UINT nFiles = DragQueryFileW(hDrop, 0xFFFFFFFF, NULL, 0); 
     if (nFiles > 0) 
     { 
      vecSelectFiles.clear(); 
      std::vector<std::wstring> vecTotalFiles; 
      vecTotalFiles.clear(); 
      for(int i=0; i<(int)nFiles; ++i) 
      { 
       wchar_t wszThisFile[MAX_PATH]; 
       memset(wszThisFile, 0, MAX_PATH*2); 
       // Here get excution path 
       if(DragQueryFileW(hDrop, i, wszThisFile, MAX_PATH) != 0) 
       { 
        vecTotalFiles.push_back(wszThisFile); 
        hr = S_OK; 
       } 
      } 
     } 
     GlobalUnlock(stm.hGlobal); 
    } 
    ReleaseStgMedium(&stm); 
} 

// If any value other than S_OK is returned from the method, the context 
// menu item is not displayed. 
return hr; 

回答

0

如MSDN所提到的,「這是建議處理程序使用一個Shell項數組,而不是剪貼板格式等CF_HDROP和CFSTR_SHELLIDLIST(也稱爲HIDA),因爲它導致更簡單的代碼,並允許一些性能改進。」

因此,首先調用pDataObj上的SHCreateShellItemArrayFromDataObject()並檢索IShellItemArray接口。枚舉它與IShellItemArray :: Count()和IShellItemArray :: GetItemAt()。

每個IShellItem對象都有一個很好的GetDisplayName()方法! 你有沒有可以指定顯示類型:

SIGDN_NORMALDISPLAY = 0x00000000, 
SIGDN_PARENTRELATIVEPARSING = 0x80018001, 
SIGDN_PARENTRELATIVEFORADDRESSBAR = 0x8001c001, 
SIGDN_DESKTOPABSOLUTEPARSING = 0x80028000, 
SIGDN_PARENTRELATIVEEDITING = 0x80031001, 
SIGDN_DESKTOPABSOLUTEEDITING = 0x8004c000, 
SIGDN_FILESYSPATH = 0x80058000, 
SIGDN_URL = 0x80068000, 

如果你有SIGDN_FILESYSPATH和SIGDN_NORMALDISPLAY IDS :-)

+0

顯示類型是我對這個接下來的學習,我會嘗試。真的非常感謝 – Tauz

+0

我嘗試這種方式,但GetDisplayName()獲取文件路徑執行名稱 例如:VS2008快捷方式將得到「devenv.exe」 – Tauz

+0

使用SIGDN_NORMALDISPLAY它應該返回快捷方式名稱,你用過那個嗎? –

相關問題