###前提・実現したいこと
とあるファイルに対してのコンテキストメニュー
(右クリックで表示されるのと同じメニュー)を取得し、
特定のメニューの有無を確認したいです
(最終的に、その特定メニューを実行させます)。
###発生している問題・エラーメッセージ
一部のコンテキストメニューは取得できている様なのですが
全部が取得できてはいないらしく、
特定のメニュー項目が必ず存在しないことになります
(特定のメニューは独自に作成・インストールされたソフトのものになります)。
###該当のソースコード
※エラーチェックなど省略して記載しています
c++
1// IShellFolder* parent 2// ITEMIDLIST* justitem_idl 指定したファイルに対してのIDLIST 3parent->GetUIObjectOf(NULL, 1, (LPCITEMIDLIST*)&justitem_idl, IID_IContextMenu, NULL, (void**)&menu1); 4// HMENU hmenu1 5hmenu1=CreatePopupMenu(); 6// IContextMenu* menu1 7menu1->QueryContextMenu(hmenu1, 0, 0, 1000, CMF_EXPLORE); 8 9int n1=GetMenuItemCount(hmenu1); 10wchar_t menu_list[1024]; 11memset(menu_list, 0, sizeof(wchar_t)*1024); 12for (int i=0; i<n1; i++) { 13 MENUITEMINFO mi; 14 wchar_t buf[1024]; buf[0]=0; 15 ZeroMemory(&mi, sizeof(MENUITEMINFO)); 16 mi.cbSize=sizeof(MENUITEMINFO); 17 mi.fMask=MIIM_SUBMENU|MIIM_FTYPE|MIIM_ID|MIIM_STRING; 18 mi.dwTypeData=buf; 19 mi.cch=1024; 20 21 // ↓デバッグ用に、取得できたメニュー項目を蓄積 22 wcscat(menu_list, mi.dwTypeData); 23 wcscat(menu_list, L"\n"); 24 25 if (mi.fType==MFT_STRING && wcsncmp(mi.dwTypeData, L"メニュー項目", 6)==0) { 26 hmenu2=mi.hSubMenu; 27 break; 28 } 29} 30if (!hmenu2) /* メニュー項目が見つからなかった */; 31 32// hmenu2に対して実行処理 33
###試したこと
コンテキストメニューの取得対象として複数種のファイル・フォルダ(MSオフィスファイル、pdf、フォルダ)で試したところ、
ちゃんと指定したファイル・フォルダのメニューを取得しようとしている様です
しかし、以下のようなメニューが取得できていません
・ソフトで実行する系(「●●で○○する」など)
↑すべてが取れていないわけでは無い様子、
例えば桜エディタの「SAKURAで開く」や7-Zipの「7-Zip」メニューなどは取得できています
・「名前の変更」「ファイルの場所を開く」
↑どのファイルでも取得できていない
(2017/07/11 追記)
・QueryContextMenuの第5引数(uFlags)をすべて試してみましたが
やはり特定のメニューは取得できません
###補足情報(言語/FW/ツール等のバージョンなど)
開発環境
・Visual Studio 2010
・OS:Windows7 64bit
ソースについて
・もともと、32bit環境で作成されたソース
・実行環境が64bit環境に変更
なにとぞ、ご助力の程よろしくお願いいたします
(不足情報ありましたら、そちらもご指摘願います)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。