2013-07-04 30 views
0

當我右鍵單擊的目標是快捷方式時,我無法獲得在執行ContextMenu時選定文件的列表。全局內存句柄返回一個僅包含快捷方式項目的列表,似乎並不瞭解我選擇的其他項目。Windows ContextMenu C++與選擇中的快捷方式

我注意到了一些第三方應用程序中的這種行爲,包括Notepad ++,WinRar和UltraEdit。

當右鍵單擊的目標是快捷方式時,獲取所選文件列表的正確方法是什麼?這對於在資源管理器中烘焙的文件壓縮功能來說不是問題(右鍵單擊>發送到>壓縮的壓縮文件夾)。

編輯:這是我目前的方法的一個小片段。 pida->cidl變爲1時,目標是一條捷徑,否則它是項目的正確的號碼我已經選擇:

CStgMedium me; 
pDataObj->GetData(&fe, &me); 

LPIDA pida = reinterpret_cast<LPIDA>(me.hGlobal); 
for(UINT i = 0; i < pida->cidl; i++) { 
    ... 
} 
+0

你正在實施什麼接口? – ST3

回答

0

我們在這裏談論IContextMenu接口?如果是這樣,你應該這樣做(錯誤可能,我正在寫沒有編譯器):

Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID){ 

    FORMATETC fetc = { CF_HDROP, null, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; 
    STGMEDIUM stgm; 

    pdtobj->GetData(&fetc, &stgm); 
    UINT count = DragQueryFile(stgm.hGlobal, 0xFFFFFFFF, null, 0); 
    char filename[255]; 

    for (int i=0; i<count; i++){ 
     DragQueryFile(stgm.hGlobal, i, filename, 255); 
     // Here do something with i-th filename 
    } 
} 

我省略了錯誤檢查的簡單性。

+0

對不起,我的意思是'IShellView',沒有任何文件或文件夾的拖放。我現在正在撥打以下電話: 'CStgMedium me; pDataObj->的GetData(FE,&me); LPIDA PIDA =的reinterpret_cast (me.hGlobal); UINT NUM = pida-> CIDL;' 的pida-> CIDL值是改變一個;在上述情況下,當我右鍵點擊的目標是一個快捷方式時,這個值變爲1,如果目標不是快捷方式,它將變成實際選擇的項目數 – kurifu

+0

「這對於放入資源管理器的文件壓縮功能來說不是問題」 - 這並不意味着公衆知道如何去做,微軟傾向於保留一些API以供其使用。 –

+0

這是真的,我希望情況並非如此,希望有人可以confirm =( – kurifu