getflv.hta のメインウィンドウのハンドルを取得
ハンドルの取得はメインウィンドウにプロセスで一意となるタイトルを付けてそれを GetWindow() で検索する。これは複数起動に対応するための処置。最初に問題となったのは document.title にタイトルを設定した直後に GetWindow() を実行してもウィンドウがヒットしないということ。適当な処理後に実行した場合はヒットする場合もあればやはりしない場合もあり信頼度がない。これは
Windows に制御が戻らないまま GetWindow() を呼び出しているため。Sleep() API を見つけて試してみたがダメ(結局指定時間だけ一時停止しているだけで他に制御が移るわけではない)。VB でいう DoEvents() が理想だが・・・。
かなり放置していた問題だが解決した。msvbvm50.dll(あるいは msvbvm60.dll) の rtcDoEvents() が使えることがわかった。おそらくは VB の DoEvents() そのものなんだと思う。
document.title = title;
Win32API.rtcDoEvents();
hWnd = Win32API.GetWindow(classname, title);
見事に取得できるようになった。この rtcDoEvents() はかなり使えるぞ。
Visual Basic Virtual Machine の標準インストール状態は
msvbvm50.dll や msvbvm60.dll は Windows 2000 以降において標準インストール(念のため最新の SP 要求)。
メッセージボックスを最前面表示
(1) getflv.hta のメインウィンドウを最前面表示にしておくと、alert() メソッドで呼び出されるダイアログも最前面表示となる(両者はオーナーとポップアップの関係)。タイトルには document.title で設定した値がそのまま使われる。
(2) MessageBox() API を使った場合、タイトルを自由に設定可能。最初の頃、オーナーをデスクトップにしていたので(hWnd に Null を指定)ダイアログのタイトルバーにアイコンが表示された(最前面表示は MB_SYSTEMMODAL を付けて実現)。もちろん最前面表示に設定したメインウィンドウをオーナーとして呼び出せばアイコンは表示されないし MB_SYSTEMMODAL も不要である。
最終更新:2008年12月09日 07:00