
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も見ています
-
VBAでコントロールのハンドルを取得したい
Visual Basic(VBA)
-
メッセージボックスのOKボタンをVBAでクリックさせたい
Visual Basic(VBA)
-
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
-
4
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
5
VBA ユーザーフォームのChangeイベントを停止したい
Access(アクセス)
-
6
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
7
親ウインドウにあるOKボタンを押す方法
Visual Basic(VBA)
-
8
他アプリの操作(メニューバー)
Visual Basic(VBA)
-
9
VBAマクロ実行時エラーの修正について
Visual Basic(VBA)
-
10
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
11
全ての変数を一気にリセットする方法はありますか?
PowerPoint(パワーポイント)
-
12
VBA IE ダウンロード ダイアログ制御(名前を付けて保存)
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vbaから他のアプリを終了
-
SetWindowText関数について
-
VC++(MFC)でタスクバーに常駐し...
-
WM_CLEARなど使えないメッセー...
-
他のウィンドウのボタンを自動...
-
CloseHandle()
-
ダイアログを閉じるとメモリー...
-
VBAでコントロールのハンドルを...
-
SendMessage で ESC など
-
チェックボックスのキーダウン...
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
コントロールの書式設定で、“コ...
-
検索の画面がでなくなってしま...
-
エクセルのコントロールツール...
-
コンボボックス内の文字サイズ変更
-
VB.NET2005 TextBox 高さ(Heig...
-
コンボボックスの一部のアイテ...
-
VBAのフォント変更(エクセルか...
-
[VB.net] DataGridViewの列ヘッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
SetWindowText関数について
-
他のウィンドウのボタンを自動...
-
メッセージボックスの選択ボタ...
-
msgboxの表示位置
-
VBAでコントロールのハンドルを...
-
メッセージハンドラ
-
点滅で知らせる方法
-
ウインドウが閉じたことを知る方法
-
SendMessage で ESC など
-
キーボード・フックのアプリを...
-
VB.netでFindWindowExやると・...
-
WM_NCLBUTTONUPについて
-
WINAPI 他のウインドウを重ね...
-
システム例外のメッセージを変...
-
VBでRegisterWindowMessage関数...
-
デスクトップ上のアイコンの位...
-
チェックボックスのキーダウン...
-
VBでRegisterWindowMessage関数...
-
C# の MDI
おすすめ情報