【入門編】【画面構成情報の取得】WMI (Win32_DesktopMonitor) による解像度およびマルチディスプレイ構成判定 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!VBScriptの世界へようこそ。
マクロの記録ボタンを押すだけの世界から一歩抜け出し、OSの深部に直接アプローチする「真の自動化」を手にしようとしているあなたを、私は心から歓迎します。

さて、業務効率化のスクリプトを書いているとき、こんな壁にぶつかったことはありませんか?
「作成したダイアログやポップアップ画面が、ユーザーの画面の端っこに変に表示されてしまう」
「マルチディスプレイ環境の人が使うと、メイン画面以外のとんでもない位置にウィンドウが飛び出してしまい、操作不能になる」

現場で動くプロのツールを作るなら、「実行しているPCの画面環境を自動で検知し、最適な位置にUIを配置する」という気配りが不可欠です。

今回は、VBScriptとWMI(Windows Management Instrumentation)を駆使して、画面の解像度やマルチディスプレイ構成を完璧に把握し、ウィンドウの表示位置を動的にコントロールする極意を伝授しましょう。
ここをクリアすれば、あなたの書くスクリプトは一気に「プロのプロダクト」のクオリティに化けますよ。

なぜ「WMI」を使うのか? VBScriptの限界を超えるアプローチ

VBScript単体では、実はディスプレイの細かい構成情報を直接取得する強力な命令を持っていません。
そこで登場するのが WMI (Windows Management Instrumentation) です。

WMIは、WindowsのハードウェアやOSの状態を管理・監視するための巨大なデータベースのようなものです。VBScriptからこのWMIを叩くことで、OSが認識しているディスプレイの物理的な解像度や、接続されているモニタの数を正確に割り出すことができます。

覚えておくべき魔法の呪文:`Win32_DesktopMonitor`

WMIには様々なクラスがありますが、ディスプレイ情報を引くときは `Win32_DesktopMonitor` というクラスを使用します。
……と言いたいところですが、実はここにVBScript自動化エンジニアが必ずハマる「最初の罠」があります。

> ⚠️ 現場の知見:マルチディスプレイ環境における罠
> `Win32_DesktopMonitor` は、マルチディスプレイ環境において「すべてのモニタの正確な個別解像度」を返してくれないケース(プライマリモニタの情報しか取れないなど)が多々あります。
> そのため、実務では `Win32_VideoController` の情報や、デスクトップ全体の総解像度を組み合わせて安全に取得するのが、トラブルを防ぐプロの定石です。

今回は、もっとも堅牢かつ実用的な、「デスクトップ全体の作業領域(タスクバーを除いたサイズ)や解像度を安全に捉え、UIの配置基準を計算するロジック」を組み立てていきましょう。

実践!画面構成情報を取得してメッセージを出すVBScript

それでは、実際のコードを見てみましょう。
以下のコードをメモ帳に貼り付け、拡張子を `.vbs` (例: `screen_check.vbs`)として保存して実行してみてください。

‘ ==============================================================================
‘ スクリプト名: GetScreenInfo.vbs
‘ 概要: WMIを使用して画面の解像度を取得し、最適なウィンドウ配置を計算する
‘ 著者: チーフアーキテクトからの贈り物
‘ ==============================================================================

Option Explicit ‘ 宣言漏れによるバグを防ぐ(プロの基本作法です)

Dim objWMIService, colItems, objItem
Dim screenWidth, screenHeight
Dim msg

‘ 1. WMIサービスへの接続(ローカルPCのcimv2名前空間を指定)
Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)

‘ 2. ビデオコントローラ(画面出力装置)の情報を取得
‘ ※Win32_DesktopMonitorよりも、現代のマルチ環境ではこちらが確実です
Set colItems = objWMIService.ExecQuery(“Select from Win32_VideoController”)

‘ 3. 取得した情報の解析
For Each objItem in colItems
‘ 画面の横幅と縦幅を取得(Nullチェックの安全策を入れるのがプロ)
If Not IsNull(objItem.CurrentHorizontalResolution) Then
screenWidth = objItem.CurrentHorizontalResolution
screenHeight = objItem.CurrentVerticalResolution
Exit For ‘ 最初の有効なアクティブディスプレイを採用
End If
Next

‘ 4. 万が一取得できなかった場合のフォールバック(既定値)
If screenWidth = “” Then
screenWidth = 1024
screenHeight = 768
End If

‘ 5. 画面中央にダイアログ(またはUI)を表示するための仮想座標を計算
‘ ※独自のHTAやVBAフォームと連携する際の基準位置になります
Dim idealLeft, idealTop
idealLeft = (screenWidth – 400) \ 2 ‘ 幅400のウィンドウを想定
idealTop = (screenHeight – 300) \ 2 ‘ 高さ300のウィンドウを想定

‘ 結果の出力
msg = “【画面構成情報の取得に成功しました】” & vbCrLf & _
“—————————————-” & vbCrLf & _
“現在の画面解像度: ” & screenWidth & ” x ” & screenHeight & vbCrLf & _
“推奨ウィンドウ幅: 400 x 300” & vbCrLf & _
“画面中央に配置する場合の左座標 (Left): ” & idealLeft & vbCrLf & _
“画面中央に配置する場合の上座標 (Top) : ” & idealTop

MsgBox msg, vbInformation, “VBScript 画面環境アナライザー”

‘ 6. オブジェクトのクリーンアップ(メモリリーク防止)
Set colItems = Nothing
Set objWMIService = Nothing

コードの深掘り解説:ここがエンジニアのこだわりポイント

初心者から一歩抜け出すために、上記のコードで重要なポイントをいくつか解説します。

1. `Option Explicit` の絶対的な義務化

コードの2行目にある `Option Explicit`。これ、面倒くさがって消していませんか?
これを記述すると、変数を `Dim` で事前に宣言することが強制されます。スペルミスによる「動かないけどエラーにもならない謎の挙動」を根絶できるため、実務のコードでは必ず先頭に書くのが鉄則です。

2. オブジェクトの適切な解放(Garbage Collectionの意識)

VBScriptが裏で動かしているCOMオブジェクト(WMIなど)は、メモリやプロセスを消費します。
スクリプトの最後にある `Set colItems = Nothing` は、不要になったメモリをOSに即座に返却するための作法です。これをサボると、何度もスクリプトを実行したときにメモリリークの原因になります。

3. 整数除算演算子 `\` の活用

コード内の `(screenWidth – 400) \ 2` という計算で、通常の割り算 `/` ではなく `\` を使っています。
これは「整数除算」といい、小数点以下を切り捨てて整数を返します。画面のピクセル座標は必ず整数でなければならないため、ここでもエンジニアとしての細かい気配りが活きています。

さらに現場で応用するために(VBAやHTAへの展開)

今回取得した解像度のロジックは、VBScript単体の `MsgBox` だけでなく、以下のような様々な現場の自動化に応用できます。

  • Excel VBAのユーザーフォームの動的配置

マルチディスプレイで作業するユーザーが、どのモニタでマクロを実行しても、そのモニタの真ん中にフォームをポップアップさせたいとき、今回のロジックをVBAに移植することで解決できます。

  • HTA (HTML Applications) のウィンドウサイズ制御

VBScriptをベースにしたGUIアプリであるHTAを作る際、起動時に `window.moveTo` や `window.resizeTo` と組み合わせて、完璧な位置にウィンドウをレンダリングできます。

おわりに

いかがでしたでしょうか?
「画面の情報をプログラムが自ら察知し、環境に合わせて挙動を変える」。
これこそが、ただの「作業の自動化」を超えた、「スマートなシステム設計」の第一歩です。

ここをクリアしたあなたなら、もうVBScriptの基礎はバッチリです!
ぜひ、ご自身の業務環境に合わせてこのコードをアレンジし、同僚がアッと驚くような洗練された自動化ツールを作ってみてくださいね。

あなたのエンジニアライフが、より快適で知的になりますように。それではまた次の極限知見でお会いしましょう!

タイトルとURLをコピーしました