タイトル : 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 |