マイナビニュースマイナビ

PowerShell 7 - ウインドウのサイズを変えるスクリプト ファイナルバージョン

【連載】

PowerShell Core入門 - 基本コマンドの使い方

【第162回】PowerShell 7 - ウインドウのサイズを変えるスクリプト ファイナルバージョン

[2021/08/20 08:00]後藤大地 ブックマーク ブックマーク

前回までで、Windowsのアプリケーションウインドウサイズを指定したサイズに変更するPowerShellスクリプト「window_resizer.ps1」を作成した。スクリプトの行数のわりには実用度の高いものができあがったのではないかと思う。コードは以下の通りだ。

#====================================================================
# 引数を処理
#====================================================================
Param(
    [String]$ProcessName="*",   # プロセス名
    [String]$WindowTitle=".*",  # ウインドウタイトル(正規表現)
    [Int32]$Width="800",        # ウインドウ幅
    [Int32]$Height="600"        # ウインドウ高さ
)

#====================================================================
# ウインドウサイズを変更する関数 Resize-Window
#====================================================================
Add-Type @"
using System;
using System.Runtime.InteropServices;

public struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

public class WinAPI
{
    // ウインドウの現在の座標データを取得する関数
    [DllImport("user32.dll")]
    public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

    // ウインドウの座標を変更する関数
    [DllImport("user32.dll")]
    public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); 
}
"@

function Resize-Window {
    param (
        $wh  # ウインドウハンドラ
    )

    # ウインドウ座標データ構造体
    $rc = New-Object RECT

    # ウインドウの現在の座標データを取得
    [WinAPI]::GetWindowRect($wh, [ref]$rc) > $null

    # 左上の場所はそのままに、ウインドウのサイズを変更
    [WinAPI]::MoveWindow($wh, $rc.Left, $rc.Top, $width, $height, $true) > $null
}

#====================================================================
# 対象となるウインドウを選択し、サイズを変更
#====================================================================
Get-Process -Name $processName |
    ? { $_.MainWindowHandle -ne 0 } |
    ? { $_.MainWindowTitle -match "$windowTitle" } |
    % {
        # ウインドウサイズを変更
        Resize-Window($_.MainWindowHandle);
}

window_resizer.ps1はあえて汎用的な仕組みで作ってある。これは、このスクリプトをベースとしてほかのスクリプトを作成するためだ。

アプリケーションウインドウのサイズを変更する作業は、もちろんユーザーや状況、業務内容によるのだが、人によっては結構頻繁に使うことになる。その場合、いちいちwindow_resizer.ps1に引数を指定して処理するのは面倒すぎる。

そこで、今回はwindow_resizer.ps1を利用するほかのPowerShellスクリプトを作成する。ここまでやって、やっと使い勝手の良いスクリプトの完成だ。

アプリごと専用のリサイズスクリプト

それでは今回の成果物だ。まず、Microsoft Edgeのウインドウサイズを1200x800に変更するスクリプト「edge1200x800.ps1」を次に示す。

#  Edgeウインドウサイズを1200x800にするスクリプト

$cmd = ${PSScriptRoot} + "\window_resizer.ps1 msedge .* 1200 800"

Invoke-Expression $cmd

Microsoft Edgeはプロセス名が「msedge」だ。これで絞り込みを行う。ウインドウタイトルは閲覧しているページに依存するため、こちらで絞り込むのは得策ではない。自動的に「MainWindowHandle」が有効になるのがアクティブになっているウインドウだけなので、この絞り込みで十分だ。

上記スクリプトを見るとわかるが、今回は実行するコマンドをいったん「$cmd」という変数に代入し、これに対してInvoke-Expressionコマンドレットを使って実行する(window_resizer.ps1とwindow_resizer.ps1が同じディレクトリに存在しているという前提で実装している)。${PSScriptRoot}がスクリプトの置いてあるディレクトリのパスになっているので、これを使ってスクリプトを特定して実行しているわけだ。

window_resizer.ps1を環境変数PATHが通ったディレクトリに配置するのであれば、上記スクリプトのような仕組みは不要だ。そのままwindow_resizer.ps1を実行すればよい。上記スクリプトはあくまでもwindow_resizer.ps1が環境変数PATHの通ったディレクトリに配置されていない場合も動作するように想定して作ったものだ。例えば、git経由でcloneしてそのまま使うような、そんなケースを想定している。

同じような感じでもう一つ、PowerShellスクリプト「excel1200x800.ps1」を作ってみた。こちらはMicrosoft Excelで同じことをしている。

#  Excelウインドウサイズを1200x800にするスクリプト

$cmd = ${PSScriptRoot} + "\window_resizer.ps1 EXCEL .* 1200 800"

Invoke-Expression $cmd

Microsoft Excelはプロセス名が「EXCEL」なので、それで絞り込みを行っている。

今回はもう一つ、設定アプリケーションの例も紹介しておく。設定アプリケーションはプロセス名はApplicationFrameHostとなる。そして、ウインドウタイトルは「設定」だ。ウインドウタイトルだけで絞り込んでもよいのだが、以下のスクリプト(systemsettings1200x800.ps1)では両方使って対象を絞り込み、サイズを変更している。

#  設定ウインドウサイズを1200x800にするスクリプト

$cmd = ${PSScriptRoot} + "\window_resizer.ps1 ApplicationFrameHost 設定 1200 800"

Invoke-Expression $cmd

このように必要に応じてアプリケーションごとにスクリプトを作成しておけば、そのスクリプトを実行するだけでウインドウサイズを変更できる。

なお、プロセス名はGet-Processコマンドレットで確認できる。アプリケーションを起動する前と起動した後にそれぞれGet-Processコマンドレットを実行すれば、起動したアプリケーションのプロセス名を確認することができる(常に背後で動いているタイプのアプリケーションはこの方法では特定できない。その場合はタスクマネージャなどから特定してみよう)。

スクリプトを実行して動作を確認

では、作成したスクリプトを実行してみよう。ここでは実際の使い勝手を良くしたいので、次のように作成したスクリプトを環境変数PATHの通ったフォルダに配置してある。こうしておくとPowerShellのタブ補完が効くので、スクリプト名の入力が簡単になるのだ。ただし、上記スクリプトを使っているので、window_resizer.ps1とほかのスクリプトは全て同じフォルダに配置してあることが前提だ(別のフォルダに配置したければ、スクリプトの中身を書き換えよう)。

作成したスクリプトは環境変数PATHの通ったフォルダに配置

それぞれ、スクリプトを実行する前の状態とした後の状態は以下の通りだ。

Microsoft Edge - スクリプト実行前

Microsoft Edge - スクリプト実行後

Microsoft Excel - スクリプト実行前

Microsoft Excel - スクリプト実行後

設定アプリケーション - スクリプト実行前

設定アプリケーション - スクリプト実行後

スクリプト名を機能に直結したものにしておくと忘れにくく、入力しやすい。このように、必要になったらスクリプトを作成してPATHの通ったフォルダにおいておけばよいのだ。実行する際、拡張子はあってもなくてもかまわない。つまり、「excel1200x800.ps1」でも「excel1200x800」でもよい。

PC作業を効率化するポイントの一つは、人間の作業を減らしてなるべくプログラムにやらせるということだ。決まりきった操作はプログラムで行ったほうが効率が良いし、間違いもない。プログラムを書くこと自体にハードルがあるのは事実だが、PowerShellはそのなかではとっつきやすいほうではないかと思う。このスキルを使えると使えないのとでは、Windows周りの作業の自動化で大きな差が出てくる。ぜひとも使える側になって、仕事の効率化を実現してもらいたい。

※ 本記事は掲載時点の情報であり、最新のものとは異なる場合がございます。予めご了承ください。

一覧はこちら

連載目次

もっと知りたい!こちらもオススメ

【連載】RPA入門 - ツールで学ぶ活用シーン

【連載】RPA入門 - ツールで学ぶ活用シーン

AIには、ルールベース、機械学習、深層学習(ディープラーニング)の3つのレベルがあり、レベルが上がるに連れてより高度な人工知能を実現しますが、AIのスピンオフという位置付けで、Digital Labor(仮想知的労働者)によるホワイトカラー業務の自動化を実現するRPAが注目されています。

関連リンク

この記事に興味を持ったら"いいね!"を Click
Facebook で TECH+ の人気記事をお届けします
注目の特集/連載
[解説動画] Googleアナリティクス分析&活用講座 - Webサイト改善の正しい考え方
Slackで始める新しいオフィス様式
Google Workspaceをビジネスで活用する
ニューノーマル時代のオウンドメディア戦略
ミッションステートメント
次世代YouTubeクリエイターの成長戦略
IoTでできることを見つけるための発想トレーニング
教えてカナコさん! これならわかるAI入門
AWSではじめる機械学習 ~サービスを知り、実装を学ぶ~
Kubernetes入門
SAFeでつくる「DXに強い組織」~企業の課題を解決する13のアプローチ~
マイクロサービス時代に活きるフレームワーク Spring WebFlux入門
AWSで作るマイクロサービス
マイナビニュース スペシャルセミナー 講演レポート/当日講演資料 まとめ
セキュリティアワード特設ページ

一覧はこちら

今注目のIT用語の意味を事典でチェック!

一覧はこちら

会員登録(無料)

ページの先頭に戻る