Windows is notoriously bad at remembering which monitor you want your apps to open on. DisplayWarp is a lightweight system tray utility that fixes this "primary monitor monopoly" by intercepting app launches and forcing them onto the display of your choice.
Quick Start · Building from Source
![]() |
![]() |
![]() |
![]() |
- Profile-Based Launching — Save a per-app rule: pick an EXE and a target monitor, click Launch. DisplayWarp opens the app and moves its window to the right screen automatically.
- Live Window Mover — See all running windows in a dropdown. Pick one and a target monitor, click Move — done instantly, no flicker.
- Visual Monitor Preview — A scaled layout preview shows all your connected displays. The selected target is highlighted green as you edit.
- Window Process Tracking — For launchers that spawn a child process (e.g. Battle.net → game), specify the child EXE name and DisplayWarp will wait for that window instead.
- Persistent Profiles — Profiles are saved to
monitor_config.jsonnext to the exe and survive restarts. - Zero Dependencies at Runtime — Ships as a single
.exe. No runtimes, no installers, no admin rights required for normal use.
- Click 📁 Select EXE and pick the application executable.
- Choose the target monitor from the dropdown (the preview highlights it green).
- (Optional) If the EXE is a launcher that opens a different process (e.g. a game client), fill in the Window process field with the child process name, e.g.
Diablo IV.exe. - Click 💾 Save Profile.
- Hit ▶ Launch whenever you want to open the app on that monitor.
- In the 🖥 Move Live Window section, click 🔄 Refresh to list all open windows.
- Pick the window from the dropdown.
- Pick the target monitor.
- Click ▶ Move.
When a profile is launched, DisplayWarp:
- Spawns the configured executable.
- Polls for the window to appear (by PID, or by child process name if specified).
- Repositions and focuses the window on the target monitor.
For the live mover, it issues a direct SetWindowPos call — no aggressive retries, no flickering, single-shot.
Requirements: Rust stable toolchain (MSVC target), Windows 10/11.
git clone https://github.com/your-username/DisplayWarp
cd DisplayWarp
cargo build --releaseThe binary will be at target/release/display_warp.exe. Copy it anywhere you like.
Profiles are stored as plain JSON in monitor_config.json next to the executable:
{ "profiles": [{ "name": "firefox.exe", "exe_path": "C:\\Program Files\\Mozilla Firefox\\firefox.exe", "target_monitor_name": "\\\\.\\DISPLAY2", "target_monitor_rect": { "left": 1920, "top": 0, "right": 3840, "bottom": 1080 }, "window_process_name": null, "force_primary": false }] }You can edit this file by hand — changes take effect on next launch.
| UI | egui / eframe |
| System Tray | tray-icon |
| Win32 | windows-rs |
| Serialization | serde + serde_json |
| File dialogs | rfd |
| Icons | egui-phosphor |
MIT



