• 締切済み

Excel VBA で外部アプリケーションのコンテキストメニューを操作したい

Excel の VBA を使用して、外部アプリケーションの操作を行うマクロを作成しています。 ボタンの押下や、テキストの変更などは行うことができているのですが、右クリックで表示されるコンテキストメニューにあるアイテムを選択する方法が分かりません。 WM_COMMAND がどこかに送られているのかと思ったのですが、操作対象のアプリケーションを Winspector で監視しても、WM_COMMAND を見つけることができません。Resource Hacker で ID を確認して、WM_COMMAND を送信しても反応がないようです。 右クリックを押してコンテキストメニューを表示、キーイベントで確定させる方法で誤魔化しているのですが、マクロ実行中に操作をしてしまうとうまく動作せず、少し困っています。 何かいい方法がありましたら、教えていただけないでしょうか。

みんなの回答

回答No.4

すみません、また間違ったことを書いてしまいました。 GetMenu() はウィンドウに関連付けられているメニューのメニューハンドルを取得する関数でした。 他のアプリケーションのポップアップメニューのメニューハンドルを取得する方法は見つかりませんでした。通常、TrackPopupMenu() や CreateMenu() 等の戻り値として取得するようです。

lapwing
質問者

お礼

いろいろとお調べいただいて、ありがとうございます。 GetMenu も試してはみたのですが、ポップアップメニューのハンドルを取得することはできませんでした。 コンテキストメニューが出てから、そこで初めてウィンドウが作成されているので、事前に知る手はずがないのかもしれません。 「WM_RBUTTONDOWN → WM_RBUTTONUP → FindWindow("#32768","") → カーソルキーとエンターキーを送信」の流れなので、他の作業をしてるとしょっちゅう邪魔されちゃいます。うーん。

回答No.3

ANo.1 で回答した者です。ANo.2 を見て、勘違いしていたことに気がつきました。ANo.2 の方のおっしゃる通り、コンテキストメニューの項目を選択する時、アプリケーションの親ウインドウにはメッセージは送られてこないと思います。 リソースからコンテキストメニューのメニューIDが取得できるのであれば、メニューIDからメニューハンドルを取得して(GetMenu か何かのAPIで取得できたと思います)、メニュー関係のAPIで選択できたように思います。 (何というAPIだったか今は確認できないので、また後ほど書きます)

lapwing
質問者

お礼

後にいただいた回答に書きますね。いろいろと調べていただいて、ありがとうございます。

回答No.2

メニューはおそらくTrackPopupMenu(あるいは-Ex)で表示させていると思いますが、この関数は戻り値で選択したメニューを判別することができます。 もしこの場合だと、ウィンドウハンドルには何もメッセージが来ない可能性があり、アプリケーションもメニュー選択をメッセージループで受け取っていない可能性があります。 解決策ではありませんが、情報のひとつとしてあげておきます。

lapwing
質問者

お礼

ありがとうございます。 うーん、思ったよりも難しいものですね。知る方法がないなら、どうしようもない……。右クリックでメニューを出して、キーイベントを送信する方法で安定するように処理してしまったほうがいいのかもしれません。 でも右クリック連打とかされると、誤作動しちゃうんですよね……。

回答No.1

右クリック時のコンテキストメニューの表示のさせかたはアプリケーションによって異なるかもしれませんが、WM_COMMAND ではないやり方として、WM_NOTIFY ( コントロールから親ウィンドウに送られる通知メッセージです ) を使用する方法があります。 SendMessage( hwnd, WM_NOTIFY, wParam, lParam ) の lParam は NMHDR 構造体へのポインタで、この構造体のメンバ変数 code が NM_RCLICK ( たぶん、NM_RCLICK = -5 です。) なら右クリックです。 lParam が指し示す NMHDR 構造体の続きの領域にクリックされた位置の情報とか、コントロールによってことなる情報が入っていたように思います。 詳しいことは NM_RCLICK で検索してみればわかるのではと思います。

lapwing
質問者

お礼

WM_NOTIFY で監視してみましたが、どうも該当するようなメッセージは流れていないようです。モノによってはこれに入ってくることもあるのですね。勉強になります。ありがとうございます。

関連するQ&A