20 Dec 2004

MDIの子ウィンドウを(σ・∀・)σゲッツ!!

MDIの子ウィンドウのhWndを(σ・∀・)σゲッツ!!するためには、MDIの構造からまず理解しなければならない。

MDIは、親ウィンドウ、子ウィンドウだけあるように見えるが、実は親と子の間にクライアントウィンドウが存在する。つまり子ウィンドウは実は孫ウィンドウだったのである。

親ウィンドウ→クライアントウィンドウ→子ウィンドウ

のような関係である。

親ウィンドウのhWndは、GetForegroundWindow()を使って(σ・∀・)σゲッツ!!していて、この関数では、MDIの子ウィンドウのhWndをゲットするのではなくて、親ウィンドウのhWndをゲットしてしまっていた。コレはコレでいいのだけれど。そこで色々試行錯誤した結果、そのhWndから、まずEnumChildWindows()を使って、子ウィンドウをすべて列挙する。そして、その子ウィンドウのhWndとGetClassName()を使って、子ウィンドウの名前を得る。この名前が「MDIClient」だったら、前述した、クライアントウィンドウが(σ・∀・)σゲッツ!!できたということになり、このウィンドウの子供(達)が、MDIの子ウィンドウということになる。GetWindowで子供をゲットすると、Zオーダーが一番上のウィンドウハンドルを得るため、MDIの子ウィンドウのアクティブなやつを(σ・∀・)σゲッツ!!することができる。

ただ、この「MDIClient」という名前を指定しているというところが問題で、実はExcel2003だとこの名前のウィンドウを持っていなく独自のクラスでラッピングしているようなのでそういうアプリの対策が問題となる。

というか、hWndからMDIの子ウィンドウがあれば、MDIの子ウィンドウのhWndをゲットできるような関数を用意しといてくれよMSヽ(`Д´)ノ


もっとスマートな方法があったら教えてクダサイ|ω・`)

◆朝
目覚まし:8:00
起床:10:00
そして11:30まで二度寝

お昼に飛び起きた。集中講義が午後からだったので(´∀`lll)
◆ヘルスメーター
64.5kg 20.2% 1548kcal
→ 一般肥満・筋肉Lv5/9

お菓子食べすぎた(´・ω・`)ショボーン

投稿者 hilo : 23:57 | Program関連

トラックバック

このエントリーのトラックバックURL:
http://hilo.s55.xrea.com/tt-cgi/tt_tb.cgi/108

コメント

コメントしてください




保存しますか? はいいいえ