コンテンツにスキップ

Pythonでウィンドウ位置指定

[質問]

WindowsのPythonで、指定したウィンドウの位置とサイズを変更するプログラムを作ってください。CLI形式で、「python winsize.py 正規表現 X Y Width Height」と実行すると、タイトルが正規表現にマッチする最初のウィンドウを、座標(X, Y) サイズ(Width,Height) に移動します。win32apiを利用してもかまいません。

[回答] Gemini

Windowsでウィンドウ操作を行うには、pywin32ライブラリ(Win32 APIのPythonラッパー)を使用するのが最も確実で効率的です。

ご要望の動作をするスクリプトを作成しました。

1. 事前準備

まず、Win32 APIを叩くためのライブラリをインストールしてください。

pip install pywin32

2. プログラム本体 (winsize.py)

import sys
import re
import win32gui
import win32con

def set_window_size(regex_pattern, x, y, width, height):
    # コンパイルした正規表現
    pattern = re.compile(regex_pattern)
    target_hwnd = None

    # 全ウィンドウを列挙してタイトルをチェックするコールバック関数
    def callback(hwnd, extra):
        nonlocal target_hwnd
        if target_hwnd is not None:
            return  # すでに見つかっていればスキップ

        if win32gui.IsWindowVisible(hwnd):
            title = win32gui.GetWindowText(hwnd)
            if pattern.search(title):
                target_hwnd = hwnd

    win32gui.EnumWindows(callback, None)

    if target_hwnd:
        print(f"Found window: '{win32gui.GetWindowText(target_hwnd)}' (HWND: {target_hwnd})")

        # SWP_NOZORDER: 現在のZオーダー(重なり順)を維持
        # SWP_SHOWWINDOW: ウィンドウを表示する
        win32gui.SetWindowPos(target_hwnd, win32con.HWND_TOP, x, y, width, height, win32con.SWP_NOZORDER | win32con.SWP_SHOWWINDOW)
        print(f"Moved to ({x}, {y}) with size {width}x{height}")
    else:
        print(f"No window found matching pattern: {regex_pattern}")

if __name__ == "__main__":
    if len(sys.argv) != 6:
        print("Usage: python winsize.py <Regex> <X> <Y> <Width> <Height>")
        sys.exit(1)

    try:
        reg = sys.argv[1]
        nx = int(sys.argv[2])
        ny = int(sys.argv[3])
        nw = int(sys.argv[4])
        nh = int(sys.argv[5])

        set_window_size(reg, nx, ny, nw, nh)
    except ValueError:
        print("Error: X, Y, Width, and Height must be integers.")

3. 実行方法

コマンドプロンプトやPowerShellから、以下のように実行します。

  • 例:メモ帳(Notepad)を画面左上に 800x600 で配置する場合
    python winsize.py ".*メモ帳.*" 0 0 800 600
    

※英語環境なら ".*Notepad.*" としてください。 * 例:Chromeを (100, 100) の位置に 1200x800 で配置する場合

python winsize.py "Google Chrome" 100 100 1200 800

注意点

  • 管理者権限: 操作したいアプリが管理者権限で実行されている場合、このスクリプトも管理者権限で実行する必要があります。
  • 正規表現: 大文字・小文字を区別します。区別したくない場合は、コード内の re.compile(regex_pattern)re.compile(regex_pattern, re.IGNORECASE) に変更してください。

特定のウィンドウがうまく見つからない場合や、複数のディスプレイを跨ぐ移動について詳しく知りたい場合は、お気軽にご相談ください。