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だから・・・