1. ホーム
  2. スクリプト・コラム
  3. hta

画面中央にHTAを作る方法(Win32_DesktopMonitor)

2022-01-25 09:49:37

ウィンドウのサイズを変更したり(必要に応じて)、中央に配置することができますが、そうすると画面に一瞬ちらつきが生じます。これはあまり目立たないので、実際の結果は期待通りのもので、HTAは画面の中央に表示されることになります。この処理をもう少しスムーズに行いたいのですが、今のところこの方法を使うしかありません。
以下は、HTAの例のコードです。(この処理を実装するには、コードをコピーしてメモ帳に貼り付け、拡張子.htaで保存します) 私たちが気にする部分(そして本当に役に立つ唯一の部分)は Window_Onload サブルーチンで、HTA がロードまたは更新されるたびに自動的に実行されます: Window_Onload サブルーチンには、次のようなものがあります。

コピーコード コードは以下の通りです。

<html>
<head>
<title>Centered HTA</title>
<HTA:APPLICATION
ID="objHTA"
APPLICATIONNAME="Centered HTA"
SCROLL="yes"
SINGLEINSTANCE="yes"
>
</head>
<SCRIPT Language="VBScript">
Sub Window_Onload
strComputer = ". "
Set objWMIService = GetObject("winmgmts:\\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * From Win32_DesktopMonitor")
For Each objItem in colItems
intHorizontal = objItem.ScreenWidth
intVertical = objItem.ScreenHeight
Next
intLeft = (intHorizontal - 800) / 2
intTop = (intVertical - 600) / 2
window.resizeTo 800,600
window.moveTo intLeft, intTop
End Sub
</SCRIPT>
<body></body>
</html>

このHTAを開始すると、-素早く点滅-ウィンドウは800x600ピクセルにリサイズされ、画面の中央に表示されます。

いい質問ですね、ここで何が起こるのでしょう?まず、標準的なWMIコードから始めて、ローカルコンピューター上のWMIサービスに接続し、Win32_DesktopMonitorクラスにクエリーを発行します。

注 ここでは、コンピュータに接続されているモニタは1台だけであると仮定しています。複数のモニターがある場合は、プライマリーモニターの画面の高さと幅を確実に取得するために、WHERE句を追加する必要があります。

Win32_DesktopMonitor クラスに接続した後、次の 2 行のコードで現在の画面の大きさを判断します。

コピーコード コードは以下の通りです。

intHorizontal = objItem.ScreenWidth
intVertical = objItem.ScreenHeight

HTAのウィンドウは、幅800ピクセル、高さ600ピクセルにすることをあらかじめ決めています。そこで、そのウィンドウの左上隅をどこに配置すればよいかは、次のコードでわかります。

コピーコード コードは以下の通りです。

intLeft = (intHorizontal - 800) / 2
intTop = (intVertical - 600) / 2

ご覧の通り、画面の幅(intHorizontal変数に格納)を取得し、800ピクセル(HTAウィンドウの水平サイズ)を差し引きます。解像度が1024x768のモニターがあると仮定します。1024から800を引くと224となり、HTAウィンドウより画面の幅がどれだけ広いかが分かります。このウィンドウを中央に配置するには、各辺が112ピクセルであることを確認する必要があります。そのため、224(つまりintHorizontal - 800)を2で割るのです。

次に、画面の高さについて、この作業を繰り返します。このディスプレイの例では、768 - 600(つまり168)を求め、2で割って84ピクセル(これはウィンドウの上下の端のサイズです)とします。

これで、あと2つやるべきことができました。1つ目は、ウィンドウのサイズを800x600ピクセルに変更することです。

window.resizeTo 800,600

次に、ウィンドウを適宜配置します。これはこれから行うことです。

window.moveTo intLeft, intTop

あとは、moveToメソッドを呼び出して、HTAウィンドウの左上隅が左から112ピクセル、上から84ピクセルになるように移動させるだけです。

ちなみに、resizeToメソッドをこのサブルーチンの一番下に置いたのは、moveToと一緒にresizeToの話をしたいという教育上の理由からです。しかし、ウィンドウのサイズを変更してサブルーチンを開始すると、わずかな、あまり目立たないフリッカーが発生します。

コピーコード コードは以下の通りです。

Sub Window_Onload
window.resizeTo 800,600
strComputer = ". "
Set objWMIService = GetObject("Winmgmts:\\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * From Win32_DesktopMonitor")
For Each objItem in colItems
intHorizontal = objItem.ScreenWidth
intVertical = objItem.ScreenHeight
Next
intLeft = (intHorizontal - 800) / 2
intTop = (intVertical - 600) / 2
window.moveTo intLeft, intTop
End Sub

大したことではありませんが、多少の助けは必要です。今後も、フリッカーをなくす方法を探していきます。(なぜ、こんなに難しいのか?理想は、HTAのウィンドウを隠してから調整・移動することで、これはInternet Explorerを使えば可能です。しかし、HTAでこれを実現する方法は見つかっていません。(でも、あきらめたわけではないんです。)