
Excel の VBA を使用して、外部アプリケーションの操作を行うマクロを作成しています。
ボタンの押下や、テキストの変更などは行うことができているのですが、右クリックで表示されるコンテキストメニューにあるアイテムを選択する方法が分かりません。
WM_COMMAND がどこかに送られているのかと思ったのですが、操作対象のアプリケーションを Winspector で監視しても、WM_COMMAND を見つけることができません。Resource Hacker で ID を確認して、WM_COMMAND を送信しても反応がないようです。
右クリックを押してコンテキストメニューを表示、キーイベントで確定させる方法で誤魔化しているのですが、マクロ実行中に操作をしてしまうとうまく動作せず、少し困っています。
何かいい方法がありましたら、教えていただけないでしょうか。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
すみません、また間違ったことを書いてしまいました。
GetMenu() はウィンドウに関連付けられているメニューのメニューハンドルを取得する関数でした。
他のアプリケーションのポップアップメニューのメニューハンドルを取得する方法は見つかりませんでした。通常、TrackPopupMenu() や CreateMenu() 等の戻り値として取得するようです。
いろいろとお調べいただいて、ありがとうございます。
GetMenu も試してはみたのですが、ポップアップメニューのハンドルを取得することはできませんでした。
コンテキストメニューが出てから、そこで初めてウィンドウが作成されているので、事前に知る手はずがないのかもしれません。
「WM_RBUTTONDOWN → WM_RBUTTONUP → FindWindow("#32768","") → カーソルキーとエンターキーを送信」の流れなので、他の作業をしてるとしょっちゅう邪魔されちゃいます。うーん。
No.3
- 回答日時:
ANo.1 で回答した者です。
ANo.2 を見て、勘違いしていたことに気がつきました。ANo.2 の方のおっしゃる通り、コンテキストメニューの項目を選択する時、アプリケーションの親ウインドウにはメッセージは送られてこないと思います。リソースからコンテキストメニューのメニューIDが取得できるのであれば、メニューIDからメニューハンドルを取得して(GetMenu か何かのAPIで取得できたと思います)、メニュー関係のAPIで選択できたように思います。
(何というAPIだったか今は確認できないので、また後ほど書きます)
No.2
- 回答日時:
メニューはおそらくTrackPopupMenu(あるいは-Ex)で表示させていると思いますが、この関数は戻り値で選択したメニューを判別することができます。
もしこの場合だと、ウィンドウハンドルには何もメッセージが来ない可能性があり、アプリケーションもメニュー選択をメッセージループで受け取っていない可能性があります。
解決策ではありませんが、情報のひとつとしてあげておきます。
ありがとうございます。
うーん、思ったよりも難しいものですね。知る方法がないなら、どうしようもない……。右クリックでメニューを出して、キーイベントを送信する方法で安定するように処理してしまったほうがいいのかもしれません。
でも右クリック連打とかされると、誤作動しちゃうんですよね……。
No.1
- 回答日時:
右クリック時のコンテキストメニューの表示のさせかたはアプリケーションによって異なるかもしれませんが、WM_COMMAND ではないやり方として、WM_NOTIFY ( コントロールから親ウィンドウに送られる通知メッセージです ) を使用する方法があります。
SendMessage( hwnd, WM_NOTIFY, wParam, lParam )
の lParam は NMHDR 構造体へのポインタで、この構造体のメンバ変数 code が NM_RCLICK ( たぶん、NM_RCLICK = -5 です。) なら右クリックです。
lParam が指し示す NMHDR 構造体の続きの領域にクリックされた位置の情報とか、コントロールによってことなる情報が入っていたように思います。
詳しいことは NM_RCLICK で検索してみればわかるのではと思います。
WM_NOTIFY で監視してみましたが、どうも該当するようなメッセージは流れていないようです。モノによってはこれに入ってくることもあるのですね。勉強になります。ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Sendkeysのタイミング
-
VBでのハンドルの使い方
-
VBA 複数セルが空白なら印刷さ...
-
msgboxの表示位置
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
グラフの交点の求め方(Excel)
-
検索の画面がでなくなってしま...
-
コントロールの書式設定で、“コ...
-
ダイアログボックスのボタンコ...
-
コンボボックス内の文字サイズ変更
-
18マスの左の方3×3のマス目を自...
-
[VB.net] DataGridViewの列ヘッ...
-
ExcelのBOOKが消えた!
-
ドロップダウンリストのフォン...
-
マインクラフト(pc版)で座標...
-
メッセージボックスを大きくす...
-
シーケンサー(PLC?)で制...
-
エクセルのコントロールツール...
-
VB.NET2005 TextBox 高さ(Heig...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
メッセージボックスの選択ボタ...
-
vbaから他のアプリを終了
-
msgboxの表示位置
-
VBAでコントロールのハンドルを...
-
他のウィンドウのボタンを自動...
-
デスクトップ上のアイコンの位...
-
SendMessage で ESC など
-
SetWindowText関数について
-
メッセージハンドラ
-
Excel VBA で外部アプリケーシ...
-
点滅で知らせる方法
-
windowsメールスロットについて...
-
マウスホイールをフックしたい
-
DLL VB Wheel ホイール
-
WM_NCLBUTTONUPについて
-
VB.netでSendMessageを使用して...
-
チェックボックスのキーダウン...
-
有効でないウインドウハンドル...
-
コールバック関数とは…(C言語)
-
キーボード・フックのアプリを...
おすすめ情報