(87)【Windows11】指定ウィンドウのサイズを1920×1080に自動変更する。

投稿者: | 2025年6月14日

425 views

【1】やりたいこと

Windows11上で、指定したWindowのサイズを 1920×1080に変更したい。

OBS Studio でアプリ操作の様子を録画したいときに、対象アプリの Windowサイズを 1920×1080に変更したかった。

【2】やってみた

1) 方針検討

Microsoft純正の IDE(=統合開発環境)である Visual Studioを使って、簡単なコンソールアプリを作ることにした。

このアプリが具備する機能は以下の通り。
1) 画面上の Windowを一覧表示する。
2) その中から一つを選択すると、その Windowsサイズを 1920×1080[pixel]に変更する。
以上

2) Visual Studioのインストール

2025年6月14日時点の最新版、Visual Studio Community 2022 をダウンロード&インストールする。
こちらのページからダウンロードできる。(個人使用は無料)
https://visualstudio.microsoft.com/ja/

インストーラを起動し、指示された通りにインストールを進めればよい。

3) プロジェクトの新規作成

今回は C++で実装する。
個人的に 30年以上前の Windows3.0時代、Visual C++ ver.1.0 FDD 26枚組(installが大変だった…) の頃から使っているので、VC++が使い易く感じる。

C#や VBなども選択できるので、好きな開発言語を選べばよい。
初級者の方には VBが簡単かもしれない。

[プロジェクトの新規作成]-[C++]ー[空のプロジェクト]
を選択し、新規プロジェクトを作成する。

4) コーディング

ChatGPT大先生のご助言に従い、以下のコードを作成した。
10分ほどで動く物が出来上がるのだから、大先生様様です。

Solution Explorer 上で新規ファイルを追加し、main.cpp と名付ける。(名前は自由)

下記のコードを書く。

#include <windows.h>
#include <iostream>
#include <string>
#include <vector>
#include <locale>
#include <io.h>
#include <fcntl.h>

using namespace std;

vector<pair<HWND, wstring>> windows;

///////////////////////////////////////////////////////////////////////////////
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
    // 不可視Windowは除外
    if (!IsWindowVisible(hWnd)) return TRUE;

    // ウィンドウタイトル取得
    WCHAR title[256];
    GetWindowTextW(hWnd, title, 256);
    size_t titleLength = wcslen(title);

    // タイトルなしウィンドウは無視(隠しウィンドウ)
    if (titleLength == 0) return TRUE;

    // ウィンドウのスタイルを取得し、ツールウィンドウなどを除外
    LONG style = GetWindowLongW(hWnd, GWL_STYLE);
    if (!(style & WS_OVERLAPPEDWINDOW)) return TRUE;  // 通常のウィンドウではない

    // 今回処理したWindowを記憶
    windows.emplace_back(hWnd, title);

    return TRUE;
}

///////////////////////////////////////////////////////////////////////////////
int wmain(int argc, wchar_t* argv[]) {
    _wsetlocale(LC_ALL, L"");
    (void)_setmode(_fileno(stdout), _O_U16TEXT);
    (void)_setmode(_fileno(stdin),  _O_U16TEXT);

    // コマンドライン引数の解析
    int win_width  = 1920;
    int win_height = 1080;
    for (int i = 1; i < argc; ++i) {
        wstring arg = argv[i];
        if (arg.rfind(L"w=", 0) == 0) {
            try { win_width = stoi(arg.substr(2)); }
            catch (...) { wcerr << L"[!] wの値が不正です: " << arg << endl; }
        }
        else if (arg.rfind(L"h=", 0) == 0) {
            try { win_height = stoi(arg.substr(2)); }
            catch (...) { wcerr << L"[!] hの値が不正です: " << arg << endl; }
        }
    }
    // 画面上のWindow情報を収集
    EnumWindows(EnumWindowsProc, 0);
    wcout << L"ウィンドウ数: " << windows.size() << L" 個" << endl;

    // 全Windowを一覧表示し、選ばせる。
    size_t index = 0;
    for (const auto& [hWnd, title] : windows) {
        wcout << L"[" << index++ << L"] " << title << endl;
        if (wcout.fail()) {
            wcerr << L"[!] 表示できない文字が含まれていたためスキップします" << endl;
            wcout.clear();  // エラー状態をリセット
        }
    }
    wcout << L"番号を入力してください: ";
    wcout.flush();
    size_t sel;
    wcin >> sel;

    // 指定Windowのサイズ変更を実行
    if (sel >= 0 && sel < windows.size()) {
        HWND target = windows[sel].first;
        MoveWindow(target, 0, 0, win_width, win_height, TRUE);
    }

    return 0;
}

5) ビルド

プロジェクトのプロパティを開く。

[C/C++]-[言語] を開き、[C++言語標準] 項目で [ISO C++17標準] 以降を選択する。
※main.cppでこの仕様に従った書き方をしているため。

[ビルド]-[ソリューションのリビルド] で exeを生成する。

6) デバッグ

Debug版で exeを生成する。
動作確認し、不具合があれば修正する。

プログラムを実行すると、現在画面上に表示されている Window一覧(Windowタイトル)が表示される。
この中から一つを選び、各行左端の番号をキー入力する。

すると…
指定した Windowsのサイズが変わる。

7) リリース

Release版で exeを生成する。
使いたい環境へ持っていき(.exeだけでよい)、使ってみる and 使ってもらう。

【3】残件

サイズ変更後の Windowを Screen captureしてサイズを確認すると、
1920 x 1080 ではなく 1906 x 1073 になっていた…

X方向に -14[pixel], Y方向に -7[pixel] も縮んでしまった。なぜ?
枠に 7[pixel]を使っているのか?

後日調査しよう。
現時点では OBS Studio への入力サイズを調整したいという目的を満たせれば OKだから・・・


アクセス数(直近7日): ※試験運用中、BOT除外簡易実装済
  • 2025-12-14: 0回
  • 2025-12-13: 1回
  • 2025-12-12: 3回
  • 2025-12-11: 1回
  • 2025-12-10: 1回
  • 2025-12-09: 2回
  • 2025-12-08: 3回
  • コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です


    日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)