[WindowDirector] マルチモニタ対応ボーダレスフルスクリーン&レイアウトプロファイル管理ツール

[WindowDirector] マルチモニタ対応ボーダレスフルスクリーン&レイアウトプロファイル管理ツール

はじめに

「WindowDirector」は、マルチモニタ環境でウィンドウをボーダレスフルスクリーン化し、そのレイアウトをプロファイルとして管理するWindows常駐アプリです。

多くのゲームやアプリケーションは、フルスクリーン表示がプライマリモニタに固定されてしまいます。

セカンダリモニタでフルスクリーンにしたい場合、Windowsのディスプレイ設定でプライマリを切り替えるという非効率な手段しかありません。

WindowDirectorは、Win32 APIでウィンドウのスタイルビットを直接書き換え、任意のモニタにボーダレスフルスクリーンで配置します。

さらに複数ウィンドウの配置をプロファイルとして保存し、ワンクリックで環境を再現できます。

ソースコードとビルド済みバイナリをGitHubで公開しています。

対応OS: Windows 10 / 11(マルチモニタ環境推奨)

C# / .NET 8 / Win32 API / MIT License

ダウンロード・ソースコード

ビルド方法

.NET 8 SDKがインストールされている環境で、以下のコマンドを実行します。

# ソースから直接実行
dotnet run

# スタンドアロン実行ファイルの生成(.NET Runtime不要)
dotnet publish -c Release -r win-x64 --self-contained -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true

スクリーンショット

タスクトレイメニュー

タスクトレイメニュー

プロファイル選択

プロファイル選択

プロファイル編集

プロファイル編集

ウィンドウ選択ダイアログ

ウィンドウ選択ダイアログ

機能一覧

機能説明
ボーダレスフルスクリーン化任意のウィンドウを指定モニタに枠なしフルスクリーン表示
プロファイル管理複数ウィンドウの配置設定を名前付きプロファイルとして保存
ワンクリック適用タスクトレイの右クリックメニューからプロファイルを選択するだけ
元に戻す「すべて解除」でウィンドウを元のサイズ・位置・スタイルに復元
プロセス名マッチングウィンドウタイトルとプロセス名の組み合わせで対象を特定
タスクトレイ常駐バックグラウンドで常駐し、必要なときだけ操作
多重起動防止Mutexによる二重起動の自動検出

技術的な仕組み

1. ウィンドウスタイルの動的書き換え

Win32 APIの SetWindowLong を使用し、対象ウィンドウのスタイルビットを直接書き換えます。

// 除去するスタイルフラグ
WS_CAPTION      (0x00C00000)  タイトルバー
WS_THICKFRAME   (0x00040000)  サイズ変更可能な枠
WS_BORDER       (0x00800000)  細い枠線
WS_DLGFRAME     (0x00400000)  ダイアログ枠
WS_MINIMIZEBOX  (0x00020000)  最小化ボタン
WS_MAXIMIZEBOX  (0x00010000)  最大化ボタン
WS_SYSMENU      (0x00080000)  システムメニュー

拡張スタイル(GWL_EXSTYLE)からも WS_EX_DLGMODALFRAMEWS_EX_CLIENTEDGEWS_EX_STATICEDGE を除去し、完全にフラットなウィンドウにします。

2. モニタ座標への精密配置

SetWindowPos で対象モニタの Screen.Bounds に一致する座標・サイズを指定し、ピクセル単位で隙間なく配置します。SWP_FRAMECHANGED フラグにより、スタイル変更を即座にウィンドウに反映します。

外部プロセスのウィンドウに対してもハンドル経由で操作可能なため、ゲーム側の設定を変更する必要はありません。

3. ウィンドウ状態の保存と復元

ボーダレス化する前に、元のスタイルビット(GWL_STYLEGWL_EXSTYLE)とウィンドウ矩形(GetWindowRect)をメモリ上に保存します。解除時にこれらを復元することで、元のウィンドウ状態に完全に戻ります。

4. プロファイルの永続化

プロファイルデータは %AppData%/WindowDirector/profiles.json にJSON形式で保存されます。各プロファイルにはウィンドウタイトル、プロセス名、対象ディスプレイインデックス、ボーダレス有無が記録され、アプリケーション再起動後も設定が維持されます。


ユースケース

ゲームをセカンダリモニタでプレイ

フルスクリーンがプライマリモニタに固定されるゲームでも、ウィンドウモードで起動してWindowDirectorでセカンダリモニタにボーダレスフルスクリーン化すれば、疑似的にセカンダリモニタでのフルスクリーンプレイが可能です。

ゲーム配信環境の即時構築

ゲーム+OBS Studioをそれぞれ別のモニタにフルスクリーン配置する設定をプロファイルとして保存しておけば、配信開始時にトレイメニューからワンクリックで環境が整います。

マルチモニタ作業環境の切り替え

プレゼンテーション、監視画面、開発環境など、用途別のウィンドウレイアウトをプロファイルとして管理し、瞬時に切り替えられます。


バージョン履歴

バージョンリリース日内容
v1.0.02026/07/30初版リリース。ボーダレスフルスクリーン化、プロファイル管理、タスクトレイ常駐

プロジェクト構成

WindowDirector/
├── NativeMethods.cs       (Win32 API P/Invoke定義)
├── WindowManager.cs       (ウィンドウ列挙・ボーダレス化・復元ロジック)
├── ProfileManager.cs      (プロファイルJSON永続化)
├── ProfileEditForm.cs     (プロファイル編集UI・ウィンドウ選択ダイアログ)
├── ProfileListForm.cs     (プロファイル一覧管理UI)
├── TrayApp.cs             (タスクトレイ常駐・コンテキストメニュー)
├── Program.cs             (エントリポイント・多重起動防止)
├── WindowDirector.csproj  (.NET 8プロジェクト定義)
├── app.ico                (アプリケーションアイコン)
└── README.md              (日英ドキュメント)

MagicKeyBatteryと同様のC# WinFormsタスクトレイ常駐アプリケーション構成ですが、UI(プロファイル編集・ウィンドウ選択)が含まれるため複数ファイルに分割しています。


開発の経緯

UNITYで開発されたSTG「SPOLOUS2」をセカンダリモニタでフルスクリーンプレイしたかったことがきっかけです。

多くのゲームはフルスクリーン表示がプライマリモニタに固定されており、これを回避する手段が限られていました。

既存のツール(ihateborders等)を調査したところ、ウィンドウ単体のボーダレス化は可能でしたが、複数ウィンドウの配置をプロファイルとして管理し、ワンクリックで環境を再現する機能を持つツールは見当たりませんでした。

MagicKeyBatteryで確立したC# WinFormsタスクトレイアプリの構成をベースに、Win32 APIによるウィンドウスタイル操作(SetWindowLong + SetWindowPos)とプロファイル管理機能を実装しました。