Skip to main content

Overview

FancyZones is a powerful window manager that allows you to create custom window layouts and quickly snap windows into predefined zones. It’s perfect for organizing multiple applications across one or more monitors with consistent, efficient layouts.
FancyZones can remember where applications were placed and automatically restore them to those zones when reopened.

Activation

1

Enable FancyZones

Open PowerToys Settings and enable FancyZones
2

Create Layout

Press Win+Shift+~ to open the layout editor
3

Snap Windows

Hold Shift while dragging windows to see zone overlays

Key Features

Custom Zone Layouts

Grid Layouts

Divide screen into equal grid cells2x2, 3x3, or custom dimensions

Template Layouts

Pre-designed layouts for common workflowsFocus, Columns, Rows, Priority Grid

Custom Layouts

Draw your own zone configurationsPixel-perfect control

Multi-Monitor

Different layouts per monitorIndependent zone configurations

Window Snapping

Multiple methods to snap windows:
Primary method:
  1. Click and start dragging a window
  2. Hold Shift key
  3. Zone overlay appears
  4. Drag to desired zone
  5. Release mouse button
Window snaps to zone

Layout Editor

Create and customize layouts:
// Layout types in FancyZones
enum class ZoneSetLayoutType
{
    Grid,           // Rows × Columns grid
    Columns,        // Vertical columns
    Rows,           // Horizontal rows
    Custom,         // User-defined zones
    Template        // Pre-designed templates
};
Editor features:
  • Visual zone editor
  • Drag to resize zones
  • Snap zones to edges
  • Spacing configuration
  • Zone count adjustment
  • Color preview

Zone Behaviors

Zone Appearance
settings
Customize how zones look:
  • Zone colors
  • Border thickness
  • Opacity levels
  • Number display
  • Zone highlighting
Snapping Behavior
settings
Control snap mechanics:
  • Snap sensitivity
  • Show zones on drag
  • Move newly created windows to zones
  • Restore zone layouts on relaunch
Multi-Monitor
settings
Per-monitor configuration:
  • Independent layouts per display
  • Move windows between monitors preserves zones
  • Span windows across zones

App-Specific Zones

FancyZones remembers window placements:
  • Application History: Tracks which app was in which zone
  • Auto-Restore: Reopened apps return to their zones
  • Virtual Desktop Aware: Different layouts per virtual desktop

Configuration

Settings Location

%LOCALAPPDATA%\Microsoft\PowerToys\FancyZones\
Layout files stored as JSON configurations.

Core Settings

editor_hotkey
hotkey
default:"Win+Shift+`"
Shortcut to open layout editor
move_newly_created_windows
boolean
default:"false"
Automatically move new windows to zones
move_windows_based_on_position
boolean
default:"false"
Snap windows to nearest zone automatically
override_snap_hotkeys
boolean
default:"false"
Use FancyZones behavior for Win+Arrow keys
zone_border_color
color
default:"#0078D7"
Color of zone borders in hex format
zone_highlight_opacity
number
default:"50"
Opacity percentage for zone highlights (0-100)
excluded_apps
array
default:"[]"
Applications excluded from FancyZones
restore_size
boolean
default:"false"
Restore window original size when moved out of zone

Layout Templates

Built-in templates:
Large center zone with smaller side panels:
┌────┬────────────┬────┐
│  1 │      2        │  3 │
│    │               │    │
│    │               │    │
│    │    (Focus)    │    │
│    │               │    │
│    │               │    │
└────┴────────────┴────┘

Use Cases

Development Workflows

Side-by-side coding layout:
┌────────────┬────────────┐
│   VS Code   │    Browser   │
│   Editor    │     Docs     │
│            │            │
├────────────┴────────────┤
│      Terminal            │
└─────────────────────────┘
Multi-pane development setup:
  1. Zone 1: Code editor (60% width)
  2. Zone 2: Browser DevTools (40% width, top)
  3. Zone 3: Terminal (40% width, bottom)
Snap applications once, reopen automatically in zones
Debugging layout:
  • Large center: Application being debugged
  • Left sidebar: Code editor
  • Right sidebar: Debug console
  • Bottom: Watch variables

Content Creation

1

Video Editing

Zone 1: Timeline (bottom, full width)Zone 2: Preview (top left)Zone 3: Effects/Media browser (top right)
2

Graphic Design

Zone 1: Design canvas (center, large)Zone 2: Layers panel (right)Zone 3: Color picker/tools (left)
3

Music Production

Zone 1: DAW timeline (bottom)Zone 2: Mixer (right)Zone 3: VST plugins (left)

Productivity

Email + Calendar

Split screen for email client and calendarQuick reference while scheduling

Research

Multiple browser windows in zonesCompare sources side-by-side

Writing

Document editor + research materialsKeep references visible while writing

Communication

Chat apps in dedicated zonesMonitor multiple channels

Multi-Monitor Setups

Monitor 1 (Primary):
  • Zone 1: Main work application (full)
Monitor 2 (Secondary):
  • Zone 1: Reference materials (top)
  • Zone 2: Communication (bottom)

Keyboard Shortcuts

Layout Management

ShortcutAction
Win+Shift+~Open layout editor (default)
Win+Left/RightSnap to zones (when override enabled)

Window Snapping

ShortcutAction
Shift + DragShow zone overlay while dragging
Shift + Drag + 1-9Snap to specific numbered zone

Editor Shortcuts

ShortcutAction
+ / -Add/remove zones (grid mode)
Arrow KeysAdjust zone boundaries
Ctrl+SSave layout
EscCancel and close editor

Technical Details

Architecture

Zone Storage

Layouts stored as JSON:
{
  "uuid": "{12345678-1234-5678-1234-567812345678}",
  "name": "Custom Layout",
  "type": "custom",
  "zones": [
    {
      "X": 0,
      "Y": 0,
      "width": 960,
      "height": 1080
    },
    {
      "X": 960,
      "Y": 0,
      "width": 960,
      "height": 1080
    }
  ]
}

Window Tracking

// App zone history tracking
class AppZoneHistory
{
    // Maps app paths to their last zone placements
    std::map<std::wstring, ZoneSetId> m_history;
    
    void SaveAppZoneHistory(
        std::wstring appPath,
        HWND window,
        ZoneSetId zoneSet,
        ZoneIndex zone
    );
    
    std::optional<ZoneIndex> GetLastZone(
        std::wstring appPath,
        ZoneSetId zoneSet
    );
};
Source: src/modules/fancyzones/FancyZonesLib/FancyZonesData/AppZoneHistory.cpp

Dragging State

Manages window drag operations:
// Drag state management
class DraggingState
{
    HWND m_draggedWindow;
    bool m_shiftKeyState;
    ZoneSetId m_activeZoneSet;
    std::vector<ZoneIndex> m_highlightedZones;
    
    void UpdateDragPosition(POINT cursorPos);
    void ShowZoneOverlay();
    void SnapToZone(ZoneIndex zone);
};
Source: src/modules/fancyzones/FancyZonesLib/DraggingState.cpp

Troubleshooting

Check:
  • FancyZones is enabled in PowerToys Settings
  • Holding Shift key while dragging
  • Window is not in excluded apps list
  • Layout is applied to current monitor
Fix:
  1. Restart PowerToys
  2. Reapply layout in editor
  3. Check Windows animation settings
Possible causes:
  • Application is excluded
  • Window is non-standard (e.g., WPF with custom chrome)
  • Elevated application (PowerToys not elevated)
Solutions:
  1. Remove app from excluded list
  2. Run PowerToys as administrator
  3. Use standard window dragging (title bar)
When monitors disconnect/reconnect:
  1. Open layout editor (Win+Shift+~)
  2. Verify correct monitor selected
  3. Reapply or recreate layout
  4. Save layout
Prevent: Use consistent monitor configurations
Check settings:
  • “Restore windows to their zone layouts” enabled
  • Application launched normally (not as admin if PowerToys isn’t)
  • App zone history not cleared
Reset:
  1. Clear app history in FancyZones settings
  2. Manually snap apps to zones again
  3. Close and reopen apps to verify

Command Line Interface

FancyZones includes a CLI for automation and scripting:

Available Commands

Get Information:
# List all monitors
FancyZonesCLI.exe get-monitors

# Get available layouts
FancyZonesCLI.exe get-layouts

# Get active layout for a monitor
FancyZonesCLI.exe get-active-layout --monitor <monitor-id>

# Get current hotkeys
FancyZonesCLI.exe get-hotkeys
Set Configuration:
# Set layout for a monitor
FancyZonesCLI.exe set-layout --monitor <monitor-id> --layout <layout-id>

# Set hotkey
FancyZonesCLI.exe set-hotkey --action <action> --key <key>

# Remove hotkey
FancyZonesCLI.exe remove-hotkey --action <action>
Open UI:
# Open layout editor
FancyZonesCLI.exe open-editor

# Open settings
FancyZonesCLI.exe open-settings
The CLI requires FancyZones to be running. All commands send notifications to the running instance.

See Also