FancyZonesをJSONで完全制御する:レイアウトの保存・配布まで徹底解説

黒を背景に、シアンブルーの発光するラインで描かれたFancyZonesのレイアウト構造グリッドとJSONコードの重なり
目次

本稿を読み進める前に

この記事は、以下のような方に向けて書きました

  • FancyZones のレイアウトを JSON で完全に制御したい
  • custom-layouts.jsonを バックアップ・配布 したい方
  • DPI・論理解像度を理解し、正確な座標でレイアウトを作りたい
  • 複数PCで同じレイアウトを再現したい方
  • FancyZonesのエラー(GUID問題・空配列化)で困った経験がある方
  • 仮想デスクトップ × 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. 手順

  1. PowerToys を完全に終了 させます
  2. custom-layouts.json を別の場所へバックアップします
  3. 新しい内容のJSONを上書き保存します
  4. PowerToysを再起動します
  5. 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.py

10. まとめ

この記事では、FancyZonesのレイアウトをJSONで完全制御する方法を解説しました。

  • FancyZonesは論理解像度を使用する
  • GUIDは純粋なGUID(UUID)でないとエラーになる
  • custom-layouts.jsonを直接編集すればレイアウトを完全にコントロールできる
  • 同じDPI・モニター構成であればJSONの共有が可能
  • 仮想デスクトップと組み合わせれば、作業空間の切り替えがよりスムーズになる

この記事の内容をマスターすることで、Windows 11を“自分専用の究極の作業空間”に仕上げるための強力な武器 を手に入れることができるはずです。

目次