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も見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
他アプリの操作(メニューバー)
Visual Basic(VBA)
-
Excel VBAで他アプリケーションの文字列取得
Excel(エクセル)
-
ExcelVBAでAPIを使って外部ウインドウのエディットテキストを取得する方法
Visual Basic(VBA)
-
-
4
VBAで既に開いている別アプリケーションのオブジェクトを得る
Visual Basic(VBA)
-
5
Alt+P,Alt+NをPostmessageで送るには
Visual Basic(VBA)
-
6
メッセージボックスのOKボタンをVBAでクリックさせたい
Visual Basic(VBA)
-
7
EnumChildWindowsの使い方(VBA)
Visual Basic(VBA)
-
8
他アプリケーション’(ウィンドウ)のハンドル取得方法
Visual Basic(VBA)
-
9
【エクセルのマクロ】クリップボードのbitmapをフォームに表示させたい
Visual Basic(VBA)
-
10
ウィンドウのタイトルからプロセス取得
Visual Basic(VBA)
-
11
VBAでコントロールのハンドルを取得したい
Visual Basic(VBA)
-
12
EXCEL VBA 他のアプリケーションからの自動貼り付け
Visual Basic(VBA)
-
13
ウインドウハンドルのつかみ方について質問です。
Visual Basic(VBA)
-
14
DLLが正しく呼び出せません (ToT)
その他(データベース)
-
15
テキストボックスのカーソル位置の取得・設定方法
Visual Basic(VBA)
-
16
VBAで、なぜかSendkeyが効きません。
PowerPoint(パワーポイント)
-
17
親ウインドウにあるOKボタンを押す方法
Visual Basic(VBA)
-
18
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
19
メッセージボックスを前面に表示させるには?
Visual Basic(VBA)
-
20
VBA初心者です。ExcelのVBAで他のアプリケーションを操作している際、操作先のアプリケーション
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vbaから他のアプリを終了
-
メッセージボックスの選択ボタ...
-
他のウィンドウのボタンを自動...
-
windows終了時のメッセージにつ...
-
メッセージハンドラ
-
msgboxの表示位置
-
SetWindowText関数について
-
マウスフックについて
-
VC++2005 OnCmdMsgでメッセージ...
-
メッセージループについて
-
Excel VBA で外部アプリケーシ...
-
デスクトップ上のアイコンの位...
-
windowsメールスロットについて...
-
PCのシャットダウン処理
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
グラフの交点の求め方(Excel)
-
コントロールの書式設定で、“コ...
-
エクセルのコントロールツール...
-
VBAのフォント変更(エクセルか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
メッセージボックスの選択ボタ...
-
他のウィンドウのボタンを自動...
-
msgboxの表示位置
-
VBAでコントロールのハンドルを...
-
デスクトップ上のアイコンの位...
-
メッセージハンドラ
-
SendMessage で ESC など
-
SetWindowText関数について
-
VB.netでFindWindowExやると・...
-
点滅で知らせる方法
-
CloseHandle()
-
SetWindowsHookEx(グローバル...
-
Excel VBA で外部アプリケーシ...
-
VBA 複数セルが空白なら印刷さ...
-
WM_NCLBUTTONUPについて
-
VBでRegisterWindowMessage関数...
-
システム例外のメッセージを変...
-
アプリケーション間での操作
-
マウスホイールをフックしたい
おすすめ情報