HTAのWindowがちょっとおかしい件について
FlashWindowでHTAのタスクバーを光らせたあと、アクティブにしても点滅状態が元に戻らないので、これはどういうことかと思って調べていました。
WindowExplorerでmshta.exeの持っているウィンドウを見てみたところ、謎の隠しウィンドウがあったので表示させてみたら、HTAのウィンドウが普通の挙動になったので、この隠しウィンドウとなんらかの関係があることがわかりました。ためしにHTAのウィンドウをGetParentすると、その隠しウィンドウを示しました。つまり、
- HTAのウィンドウは隠しウィンドウに所有されてる
- オーナーウィンドウが隠れてると、所有されてるウィンドウの挙動がおかしくなる
ということで、以下のような問題解決方法が考えられました。
- 隠しウィンドウを表示する
- 関係を断ち切って、HTAのウィンドウを独立させる
まず後者で検討してみましたが、SetParentなるものはオーナーウィンドウを変えるものではないようだし、どうやらWin32APIでオーナーウィンドウを変えることはできないようなので、(フックとか使えばいけるかもしれないけど)前者でやることにしました。
実はWin9x系では点滅状態が元に戻らない不具合がでなかったので、以下のような荒業で解決しました。
隠しウィンドウに対して
- SetWindowLongでWS_EX_LAYEREDとWS_EX_TOOLWINDOWを追加
- WS_EX_TOOLWINDOWでタスクバーとALT+TABの切り替えから消している
- SetLayeredWindowAttributesで透明にする
- ShowWindowで表示
をHTAの起動時に行います。
ただしこのやり方は自分のパソコン(WinXPsp3, Win2ksp4)でしか試してないです。