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

PowerShell 7 - ウインドウのサイズを変えるスクリプト window_resizer.ps1

【連載】

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

【第161回】PowerShell 7 - ウインドウのサイズを変えるスクリプト window_resizer.ps1

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

前回までで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);
}

それほど長くないスクリプトだが、結構便利に使うことができる。以降では、各ポイントについて詳しく説明する。

アプリケーション、サイズなどを引数で指定

汎用的に利用できるように、ウインドウを特定するためのプロセス名とウインドウタイトル、それにサイズ(ウインドウの幅と高さ)をパラメータとして指定できるようにする。

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

整理すると次のようになる。

パラメータ 内容 デフォルト値
ProcessName プロセス名 *
WindowTitle ウインドウタイトル(正規表現) .*
Width ウインドウ幅 800
Height ウインドウ高さ 1200

パラメータを指定しなくても動作するように、デフォルト値が設定されている点にも注目しよう。ProcessNameのデフォルト値は「*」なので、ProcessNameが指定されなかった場合には「Get-Process -Name $processNameがGet-Process -Name *」として機能するので、要するに全てのプロセスが一致するようになる。ウインドウタイトルは「.*」がデフォルト値なので、「$_.MainWindowTitle -match “$windowTitle”」が「$_.MainWindowTitle -match “.*”」となり、こちらも全てのウインドウが一致するようになる。

設定するデフォルト値は用途に応じて設定してもらえればよいのだが、こんな感じでパラメータが指定されなかった場合にも動作する値に設定しておくとよい。

ウインドウサイズを変更するためのWinAPI

ウインドウサイズを変更するためのWindows APIは次のように用意しておく。

#====================================================================
# ウインドウサイズを変更する関数 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); 
}
"@

上記の記述については前回、前々回に説明した通りだ。

ウインドウサイズを変更する関数 Resize-Window

ウインドウサイズを変更する処理を関数Resize-Windowとしてまとめておく。

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);
}

対象となるウインドウは次の手順で選択している。

  1. プロセス名
  2. MainWindowHandleが0以外
  3. ウインドウタイトル(正規表現一致)


プロセス名もウインドウタイトルも指定しなかった場合には、次のようになる。

  1. 全てのプロセス
  2. MainWindowHandleが0以外
  3. 全てのウインドウタイトル


プロセス名もウインドウタイトルも指定しなかった場合、MainWindowHandleが0以外の全てのウインドウが全て対象となる。一気に全てが同じサイズになるので、見ていて面白かったりもする。

実行してみよう

実際にスクリプトを実行してみよう。まず、次のように特にサイズを指定していないMicrosoft Edgeが実行されていたとする。

Microsoft Edge

作成したwindow_resizer.ps1を環境変数PATHに登録されているフォルダにコピーし、次のように実行する。

window_resizer.ps1でMicrosoft Edgeのウインドウサイズを1200x800へ変更

すると、動作しているMicrosoft Edgeのサイズが次のように1200x800へ変更される。

サイズ変更後のMicrosoft Edge (1200x800)

書類を作る場合など、アプリケーションサイズを変更したり、画像を加工したりする必要に迫られることがある。window_resizer.ps1を使うと、あらかじめ必要となるサイズに調整しておけるので、作業の手間を削減することができる。

このように、PowerShellは手軽でありながら強力なツールとして日々の作業を低減する手助けをしてくれる。使えるようになればなるだけ、大きな”力”になってくれるはずだ。

参考

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

一覧はこちら

連載目次

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

【連載】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用語の意味を事典でチェック!

一覧はこちら

会員登録(無料)

ページの先頭に戻る