tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^4: (御礼・一応解決)メニューハンドルの取得方法
投稿日: 2013/06/08(Sat) 09:44
投稿者genesis
魔界の仮面弁士さま、引き続く数々のご助言をありがとうございます。


まず結論から言うと、「メニューはウィンドウに属する」を足掛かりに
いろいろ調べた末、一応解決を見ました。

全プロセスの全ウィンドウハンドルに対してGetMenu()等を行った所、
今回ターゲットとするIEウィンドウのタイトルと同名(但し文字列
" - Microsoft Internet Explorer"を除く)の不可視ウィンドウ(の
トップウィンドウハンドル)に対するGetMenu()により、所望の
メニューバーのメニューハンドルが取得できることが判りました。
このメニューハンドルを用いてGetMenuItemInfo()、GetSubMenu()を
行い、ターゲットのメニューと特定できました。

隠しウィンドウ自体はメニューバーを持つだけでメニュークリック
に反応こそすれサブメニューすら展開されないのですが、
ターゲットのメニューにかかわる情報は、この「隠しメニュー」から
とれるような仕掛けになっているみたいです。


あらためて、皆様に御礼申し上げます。



#AccessibleObjectにかかわる情報もありがとうございます。
 今回は出番がなかったようですが、他アプリ操作を自動化
 する手段の一つとして勉強させていただきます。
 (accExplorerを手に入れて少しトライしたのですが、正直
 まだ理解が及ばず、今回ご報告できる内容に達しており
 ません…)
 ウィンドウに関連付けられていないポップアップメニュー
 のような存在もはじめて知りました。メニューハンドル
 取得で行き詰った際、選択肢の1つとして頭に入れておき
 たいと思います。


> ポップアップメニューの場合、GetMenu では拾えません。
> ウィンドウに関連付けられているメニューではないからです。
>
> 必要なのは親メニューなのでしょうが…使う側としても、
> LoadMenu や CreateMenu / CreatePopupMenuEx を通じて
> 得るハンドルであって、hWnd は無関係なんですよね。
>
>
> > 座標を与えてマウスでクリックすることが必要となるため、
> AccessibleObjectFromWindow API か AccessibleObjectFromPoint API を使って
> 親ウィンドウの IAccessible インターフェイスを得て、そこから
> 目的のメニュー項目まで、AccessibleChildren API か
> accNavigate / accChild などで辿ることはできるでしょうか?
>
> そこまで辿れれば、IAccessible.doDefaultAction メソッドが使えそうです。
>
> IAccessible の調査には、accExplorer や Inspect ツールを使えます。
> http://www.ka-net.org/blog/?p=1131

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。