質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

Q&A

解決済

1回答

3032閲覧

VC++ コンテキストメニューを漏れなく取得する方法

YaMuRo765

総合スコア15

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

0グッド

1クリップ

投稿2017/07/10 01:53

編集2017/07/11 09:53

###前提・実現したいこと
とあるファイルに対してのコンテキストメニュー
(右クリックで表示されるのと同じメニュー)を取得し、
特定のメニューの有無を確認したいです
(最終的に、その特定メニューを実行させます)。

###発生している問題・エラーメッセージ
一部のコンテキストメニューは取得できている様なのですが
全部が取得できてはいないらしく、
特定のメニュー項目が必ず存在しないことになります
(特定のメニューは独自に作成・インストールされたソフトのものになります)。

###該当のソースコード

※エラーチェックなど省略して記載しています

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環境に変更

なにとぞ、ご助力の程よろしくお願いいたします
(不足情報ありましたら、そちらもご指摘願います)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

コードの問題ではありませんでした、ビルド設定を誤っていました。
メニューバーのプルダウンで64bit対応にしたつもりが、
中身は32bit版のビルド設定のままでした。

そもそも使用している環境(visual studio 2010 express edition)に
64bitコンパイラをインストールされていなかったので、
以下のサイトを参考にインストールしたところ64bit版インストールができ、
目的のメニューも取得・実行できるようになりました。

http://www.projectgroup.info/tips/Others/comm_0004.html

投稿2017/07/13 04:09

YaMuRo765

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問