
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) [貼り付けオプション]とは? 3 2022/04/17 08:15
- Word(ワード) Word 2016のマクロを Word 2021のWordでキー動作させたい 3 2023/04/12 16:14
- Excel(エクセル) VBAで「クエリと接続」の画面を出せますか? 2 2022/10/24 13:35
- Visual Basic(VBA) VBA 複数のブックに同じ列を表示させる方法 2 2022/07/20 23:49
- Visual Basic(VBA) VBA アドインについて お詳しい方 ご教授をお願いします。 相談事項 現在以下の対応を実施した所、 1 2022/11/02 16:53
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
- Visual Basic(VBA) PowerPoint VBA で画像の鮮明度を変更する方法がわかりません 2 2023/03/24 13:34
- その他(プログラミング・Web制作) Pythonでexcelのvbaを作成、実行する方法について Pythonで表の自動集計プログラムを 3 2022/07/09 09:58
- Excel(エクセル) 【Excel】指定のセル内容を基に別シートのセルを検索して選択する【VBA】 1 2022/06/16 16:16
このQ&Aを見た人はこんなQ&Aも見ています
-
VBAでコントロールのハンドルを取得したい
Visual Basic(VBA)
-
メッセージボックスのOKボタンをVBAでクリックさせたい
Visual Basic(VBA)
-
ユーザーフォームのSetFocusが働かない?
その他(プログラミング・Web制作)
-
-
4
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
5
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
6
親ウインドウにあるOKボタンを押す方法
Visual Basic(VBA)
-
7
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
8
他アプリの操作(メニューバー)
Visual Basic(VBA)
-
9
VBA ユーザーフォームのChangeイベントを停止したい
Access(アクセス)
-
10
VBAマクロ実行時エラーの修正について
Visual Basic(VBA)
-
11
VBAで単一ブック複数窓を閉じるイベント
その他(Microsoft Office)
-
12
全ての変数を一気にリセットする方法はありますか?
PowerPoint(パワーポイント)
-
13
名前をつけて保存した後、元のファイルに戻るには
その他(コンピューター・テクノロジー)
-
14
VBA IE ダウンロード ダイアログ制御(名前を付けて保存)
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vbaから他のアプリを終了
-
VBAでコントロールのハンドルを...
-
msgboxの表示位置
-
グラフの交点の求め方(Excel)
-
エクセルで作った新しいウイン...
-
勝手にウィンドウが開いて止ま...
-
マインクラフト(pc版)で座標...
-
Minecraft 統合版(PC)の描画距...
-
検索の画面がでなくなってしま...
-
【VB2008】 マウス操作の一時的...
-
コントロールの書式設定で、“コ...
-
コンボボックス内の文字サイズ変更
-
スピンボタンを右クリックして...
-
CEdit の内容が変わった時にメ...
-
ダイアログベースのexeで最適な...
-
指定ウィンドウのアイコンのキ...
-
MFC DrawText 背景色とフォント
-
簡単なペイントソフトを作って...
-
「アイテムは収集されました」...
-
PAGESで表と表の間隔を調整する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
msgboxの表示位置
-
メッセージボックスの選択ボタ...
-
SetWindowText関数について
-
他のウィンドウのボタンを自動...
-
VB.netでFindWindowExやると・...
-
デスクトップ上のアイコンの位...
-
メッセージハンドラ
-
VBAでコントロールのハンドルを...
-
システム例外のメッセージを変...
-
VBでRegisterWindowMessage関数...
-
VC++(MFC)でタスクバーに常駐し...
-
VBA 複数セルが空白なら印刷さ...
-
16進数入力制限方法
-
グローバルフック(SetWindowsH...
-
マウスホイールをフックしたい
-
WM_NCLBUTTONUPについて
-
キーボード入力をHSPでさせたい...
-
点滅で知らせる方法
-
チェックボックスのキーダウン...
おすすめ情報