本稿を読み進める前に
この記事は、以下のような方に向けて書きました
- FancyZones のレイアウトを JSON で完全に制御したい 方
- custom-layouts.jsonを バックアップ・配布 したい方
- DPI・論理解像度を理解し、正確な座標でレイアウトを作りたい 方
- 複数PCで同じレイアウトを再現したい方
- FancyZonesのエラー(GUID問題・空配列化)で困った経験がある方
- 仮想デスクトップ × FancyZonesの環境を 技術的に安定運用したい 方
各モードの具体的な運用思想や、ウィンドウ配置の意図については、以下の記事を参照ください。
- Windows 11:仮想デスクトップ × FancyZones実践ガイド(前編) ~作業モード別の空間設計~
- Windows 11:仮想デスクトップ × FancyZones実践ガイド(後編) ~仕様理解と高速運用のコツ~
読者がこの記事から得られるもの
- FancyZonesのレイアウトをJSONで完全制御するための 正しい知識
- DPI150%環境での 論理解像度の扱い方
- custom-layouts.jsonの構造と 安全な編集手順
- GUIDの仕様と、FancyZonesがエラーを出す理由
- JSONを使った レイアウトの配布・展開 の方法
- 仮想デスクトップごとのレイアウト記憶の仕組み(Windows側の挙動)
- Windows 11を“自作ウィンドウマネージャ”として扱うための 技術的基盤
FancyZonesをJSONで完全制御する
レイアウトの保存・配布まで徹底解説:
Windows 11の作業効率を最大化するうえで、仮想デスクトップ × FancyZones の組み合わせは非常に強力です。
しかし、FancyZonesの真価は GUIではなくJSONにあります。
- レイアウトを外部ファイルとして保存
- バックアップ
- 別PCへの配布
- DPIスケールに応じた調整
- レイアウトのテンプレート化
これらを理解すると、FancyZonesは“自作ウィンドウマネージャ”として活用できるようになります。
この記事では、FancyZonesのレイアウトを JSON で完全制御する方法 を解説します。
著:くまちこ
公式:くまちこラボ(kumachiko-lab.com)
SNS(X | 旧 Twitter):@kumachiko7
本編に入る前に、まずはFancyZonesの設定ファイルがどこに隠されているのか、その実態から確認していきましょう。
1. FancyZonesの設定ファイルはどこにある?
FancyZonesのレイアウト定義は、以下のパスにあるファイルに保存されています。
%LOCALAPPDATA%\Microsoft\PowerToys\FancyZones\custom-layouts.json
このファイルには レイアウトのテンプレートだけ が保存されます。
- どの仮想デスクトップでどのレイアウトを使っているか
→ JSONには保存されません(Windows側が記憶します) - レイアウトそのものの定義
→ JSONに保存されます(今回メインで扱う部分です)
2. FancyZonesが使う「論理解像度」の仕組み
FancyZonesは物理解像度ではなく、DPIスケール適用後の 「論理解像度」 を基準に座標を計算します。
2.1. 解像度の計算例
例えば、4K(3840 × 2160)モニターでDPI 150%を設定している場合、計算式は以下の通りです。
- 横:3840 ÷ 1.5 = 2560
- 縦:2160 ÷ 1.5 = 1440
FancyZonesのJSONに登場するref-width / ref-height は、この論理解像度が基準 になります。
例えば、私の環境では以下のようになっています。
- 左側:PC Monitor → 1920 × 1200
- 中央:4K Monitor → 2560 × 1440
- 右側:4K Monitor → 2560 × 1440
2.2. 注意点:タスクバーによる有効領域の変動
実際の ref-height は、タスクバーの表示状態によって数ピクセル減少する場合があります。
JSONを手動で書き換える際は、一度GUIでダミーのレイアウトを作成し、現在の環境で認識されている正確な ref-width / ref-height を確認することをお勧めします。
※タスクバーを「自動的に隠す」設定にしている場合は、この限りではありません。
3. custom-layouts.json の構造を理解する
FancyZonesのJSONは非常にシンプルで、以下のような構造になっています。
※二重波括弧「{{}}」で囲んだ部分は、その内容で読み替えてください。
{
"custom-layouts": [
{
"uuid": "{{GUID}}",
"name": "{{レイアウト名}}",
"type": "canvas",
"info": {
"ref-width": 2560,
"ref-height": 1440,
"zones": [
{ "X": 0, "Y": 0, "width": 1280, "height": 1440 },
...
],
"sensitivity-radius": 20
}
}
]
}3.1 重要ポイント
zonesの座標は 論理解像度ベース ですuuidは 純粋なGUID形式でないとFancyZonesがエラーを出しますnameは自由に付けてOKですtypeは基本的にcanvasのままで問題ありません
4. GUIDの仕様に注意(ここが最大の落とし穴)
FancyZonesはGUIDの形式チェックが非常に厳格です。
4.1. OK(純粋な GUID)
{4B8D4715-D080-4656-9538-CFB61BDA32D9}4.2. NG(FancyZonesがエラーを出す形式)
{A1C1F4D1-5E2B-4A7A-9F11-DEVLEFT0001}GUID(UUID)に許可されているのは、RFC4122で定義された128ビットの識別子であり、16進数以外の文字は規格外となるため、FancyZonesはこれを拒否して読み込みに失敗します。
こうなるとFancyZonesは、custom-layouts.jsonを空配列(中身なし)に初期化してしまいます。
もしこの記事を読んでいる最中に「レイアウトが消えてしまった!」という事態になった場合、ほとんどがこれが原因です。
5. 実際に使えるレイアウト JSON(DPI150%版)
以下は、実際に動作確認済みの 完全版 custom-layouts.json の例です。
- DPI150%対応
- 左側|LEFT:1280 × 800
- 中央|CENTER:2560 × 1440
- 右側|RIGHT :2560 × 1440
- DEV / MUSE / BIZ / FREE × 左/中央/右
- 左側はすべて共通
- GUIDはすべて純粋なGUID
- FancyZonesが確実に読み込める形式
{
"custom-layouts": [
{
"uuid": "{4B8D4715-D080-4656-9538-CFB61BDA32D9}",
"name": "COMMON-LEFT",
"type": "canvas",
"info": {
"ref-width": 1280,
"ref-height": 800,
"zones": [
{
"X": 0,
"Y": 0,
"width": 1280,
"height": 772
},
{
"X": 29,
"Y": 27,
"width": 1249,
"height": 772
}
],
"sensitivity-radius": 20
}
},
{
"uuid": "{39F10802-E15C-4458-83CD-97C2B0CE7076}",
"name": "DEV-CENTER",
"type": "canvas",
"info": {
"ref-width": 2560,
"ref-height": 1440,
"zones": [
{
"X": 0,
"Y": 104,
"width": 2560,
"height": 1183
},
{
"X": 1328,
"Y": 104,
"width": 1213,
"height": 1335
},
{
"X": 100,
"Y": 251,
"width": 1228,
"height": 1188
}
],
"sensitivity-radius": 20
}
},
{
"uuid": "{C84C72DA-A22D-4879-A9AF-1AB33237DA12}",
"name": "DEV-RIGHT",
"type": "canvas",
"info": {
"ref-width": 2560,
"ref-height": 1440,
"zones": [
{
"X": 28,
"Y": 70,
"width": 2515,
"height": 1298
},
{
"X": 1168,
"Y": 0,
"width": 1392,
"height": 1131
},
{
"X": 0,
"Y": 0,
"width": 1168,
"height": 1131
},
{
"X": 699,
"Y": 894,
"width": 1861,
"height": 545
}
],
"sensitivity-radius": 20
}
},
{
"uuid": "{3C4B3E9C-84EC-4448-85CA-3DBC555F6073}",
"name": "MUSE-CENTER",
"type": "canvas",
"info": {
"ref-width": 2560,
"ref-height": 1440,
"zones": [
{
"X": 4,
"Y": 103,
"width": 2509,
"height": 1267
},
{
"X": 31,
"Y": 0,
"width": 1297,
"height": 1301
},
{
"X": 1328,
"Y": 100,
"width": 1231,
"height": 1197
},
{
"X": 1328,
"Y": 1060,
"width": 1213,
"height": 378
},
{
"X": 31,
"Y": 549,
"width": 1297,
"height": 889
}
],
"sensitivity-radius": 20
}
},
{
"uuid": "{DA489676-28A8-40DD-9518-A6DF020ADE7A}",
"name": "MUSE-RIGHT",
"type": "canvas",
"info": {
"ref-width": 2560,
"ref-height": 1440,
"zones": [
{
"X": 28,
"Y": 69,
"width": 2515,
"height": 1298
},
{
"X": 1168,
"Y": 0,
"width": 1392,
"height": 1130
},
{
"X": 0,
"Y": 0,
"width": 1168,
"height": 1130
},
{
"X": 699,
"Y": 893,
"width": 1861,
"height": 545
}
],
"sensitivity-radius": 20
}
},
{
"uuid": "{ECD54565-CC3B-4AAD-AA5A-77E6FA34F2BF}",
"name": "BIZ-CENTER",
"type": "canvas",
"info": {
"ref-width": 2560,
"ref-height": 1440,
"zones": [
{
"X": 0,
"Y": 0,
"width": 1328,
"height": 1440
},
{
"X": 1328,
"Y": 104,
"width": 1232,
"height": 1335
}
],
"sensitivity-radius": 20
}
},
{
"uuid": "{F9508414-762D-4710-B376-D0F21BE851E0}",
"name": "BIZ-RIGHT",
"type": "canvas",
"info": {
"ref-width": 2560,
"ref-height": 1440,
"zones": [
{
"X": 28,
"Y": 70,
"width": 2515,
"height": 1298
},
{
"X": 1168,
"Y": 0,
"width": 1392,
"height": 1131
},
{
"X": 0,
"Y": 0,
"width": 1168,
"height": 1131
}
],
"sensitivity-radius": 20
}
},
{
"uuid": "{CA3E98EA-8809-4698-B6CD-9694AC091A98}",
"name": "FREE-CENTER",
"type": "canvas",
"info": {
"ref-width": 2560,
"ref-height": 1440,
"zones": [
{
"X": 0,
"Y": 0,
"width": 1339,
"height": 1440
},
{
"X": 1048,
"Y": 104,
"width": 1512,
"height": 1335
}
],
"sensitivity-radius": 20
}
},
{
"uuid": "{6CCFCE6D-B144-4EF6-9BD3-B52D3AF01CBA}",
"name": "FREE-RIGHT",
"type": "canvas",
"info": {
"ref-width": 2560,
"ref-height": 1440,
"zones": [
{
"X": 0,
"Y": 0,
"width": 2543,
"height": 1440
}
],
"sensitivity-radius": 20
}
}
]
}6. JSONを適用する手順(安全な方法)
⚠️ Warning: 編集前のバックアップは必須です
FancyZonesは、JSONの記述ミス(カンマの過不足やGUID形式エラー)に対して非常にシビアです。
読み込みに失敗すると、現在のファイルを即座に初期化(中身を空に)して上書き してしまいます。
6.1. 手順
- PowerToys を完全に終了 させます
custom-layouts.jsonを別の場所へバックアップします- 新しい内容のJSONを上書き保存します
- PowerToysを再起動します
- FancyZones Editorを開き、正しく反映されているか確認します
7. JSONを配布する場合の注意点
7.1. 同じ論理解像度ならそのまま使える
- 4K(DPI 150%) → 2560 × 1440
- 1920 × 1200(DPI 150%) → 1280×752
同じDPI設定かつ同じモニター構成であれば、作成したJSONはそのまま配布して他のPCでも利用可能 です。
7.2. DPIが違う場合は変換が必要
例えば、以下の場合は座標の再計算が必要です。
- DPI 100% → 3840×2160
- DPI 125% → 3072×1728
この場合、スケールに合わせて各座標値を変換しなければなりません。
8. 仮想デスクトップ × JSONの組み合わせが強い理由
Windows 11には以下の特性があります。
- 仮想デスクトップごとに 最後に使った FancyZones レイアウトを自動で記憶する
つまり、
- DEVデスクトップを開けば → 自動でDEVレイアウトが適用される
- MUSEデスクトップに切り替えれば → 自動でMUSEレイアウトに変わる
といった切り替えが 自動で復元されます。
JSONはあくまで“レイアウトの型”を保存する役割を担い、「どのデスクトップにどの型をはめるか」という紐づけはWindowsが裏側で保持してくれるのです。
9. レイアウトファイルの導入とカスタマイズ
私の環境(4K 150%)をベースに、主要な解像度にリサイズしたプリセットを用意しました。
9.1. プリセットをそのまま使う
ご自身の環境に近いものを選択し、リンク先のJSON内容を custom-layouts.json に上書きしてください。
4K 150%(論理 2560×1440)用プリセット
4K 100%(論理 3840×2160)用プリセット
WQHD 100%(論理 2560×1440)用プリセット
FHD 100%(論理 1920×1080)用プリセット
9.2. 自分の環境に合わせてビルドする(Python)
ウルトラワイドモニターや特殊なDPI設定を使用している場合は、以下のPythonプログラムを活用してください。
generate_fancyzones_layouts.py
TARGET_ENVS リストに、ご自身のモニターの「論理横幅(w)」と「論理高さ(h)」を追加して実行するだけで、比率を維持したまま全レイアウトのJSONファイルが自動生成されます。
# scripts/generate_fancyzones_layouts.pyのTARGET_ENVSに、以下のように必要な解像度を追加してください。
TARGET_ENVS = [
{"label": "my-special-monitor", "w": 3440, "h": 1440}, # 例:UWQHDなど
]実行方法:
python generate_fancyzones_layouts.py10. まとめ
この記事では、FancyZonesのレイアウトをJSONで完全制御する方法を解説しました。
- FancyZonesは論理解像度を使用する
- GUIDは純粋なGUID(UUID)でないとエラーになる
- custom-layouts.jsonを直接編集すればレイアウトを完全にコントロールできる
- 同じDPI・モニター構成であればJSONの共有が可能
- 仮想デスクトップと組み合わせれば、作業空間の切り替えがよりスムーズになる
この記事の内容をマスターすることで、Windows 11を“自分専用の究極の作業空間”に仕上げるための強力な武器 を手に入れることができるはずです。
