コンテキストメニューの項目名取得方法

解決


ouoh  2012-09-21 04:45:16  No: 42964

はじめまして。
はじめて触るDelphiで行き詰まり、質問させていただきます。

現在、クリックしたものの名前を取得するアプリを作成しています。
ですが、どうしてもコンテキストメニューの選択項目名の
取得方法が分からず困っています。
デスクトップ上で右クリックして表示するコンテキストメニューの例で言えば、
「最新の情報に更新(E)」や「プロパティ(R)」などです。

ちなみに、アプリのボタン名などを取得する際はマウスカーソル下の
ウィンドウハンドルを取得して、それに対応した名前を取得しています。
メニューバーなどの場合はMSAAのIAccessibleを用いて取得しています。

正直、コンテキストメニューに関しては全く方法の検討がついておりません。
どうかご教授お願いいたします。

Delphi:Delphi7
動作環境:WindowsXP&7


monaa  2012-09-21 19:31:41  No: 42965

Mr.XRAYさんのサンプルは試しましたか?
678_他のアプリの操作と IAccessible インターフェイス
http://mrxray.on.coocan.jp/Delphi/plSamples/678_IAccessibleInterface.htm
コンテキストメニューはMSAAで取得可能です。


ouoh  2012-09-21 20:18:07  No: 42966

有益な情報ありがとうございます。

そのコードは既に参考にしたものを組み込んでいます。
しかしそれで取れるはずなのに取れていないということは、
取得したハンドルが間違っている気がしてきました。
今はクリック直後にハンドルを取得しているのですが、
クリックした瞬間にコンテキストメニューは非表示になるため、
違うハンドルを取得しているのかも??

クリック前に予め名前を取得しておくように処理の順番を組み替えてみます。
上手くいきましたらまた報告させていただきます。


Nov  2012-09-21 20:58:25  No: 42967

>今はクリック直後にハンドルを取得しているのですが、
そのメニュー操作は実行されてしまうのではないかと。
GetAsyncKeyStateで、メニュー操作に関係ないシフトキーなどを使用してはどうでしょう(マウス+キー操作が面倒でなければ)。


ouoh  2012-09-22 03:57:55  No: 42968

Novさん、アドバイスありがとうございます。
ただ、私の説明不足だったのが悪いのですが、
今回のアプリは趣味ではなく仕事での開発のため、
マウス+キーという特殊操作は無理なんです。。
ですがそんな方法もあるんですね。勉強になります。

お蔭様でコンテキストメニューの項目名も取得できるようになりました!
やはりクリック後ではコンテキストメニューのハンドルを取得出来ていないようでした。
IAccessibleインターフェイスを用いて項目名を取得する関数を、
クリック後に呼び出すのではなく、マウス操作の
ウィンドウズメッセージを受け取る度に呼び出すことで、
常にマウス座標直下の名前を取得しておくことで実現出来ました。

monaaさん、Novさん、ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加