A tiny Windows daemon for dual-monitor gamers: keep the game on the big screen and everything else on the small one, without fighting you.
When a new top-level window appears, screen-split decides once, within its first few seconds, which monitor it belongs on:
- Game family (WeGame launcher, Riot Client, League client, or any executable under
-GameRoots) goes to the big screen (default 2560x1440). - Everything else goes to the small screen (default 1920x1080), centered and kept maximized if it was maximized.
After that the window is yours. Drag it anywhere and it stays there. The in-match window (League of Legends.exe) is never touched, because moving it breaks mouse input.
Many full-screen games behave only on the primary display. If you also work on a second monitor, every new browser, chat, or terminal window opens on the game screen and steals focus mid-match. Changing the primary display doesn't help because the game breaks. screen-split keeps the primary display as it is and routes new windows instead.
# try it first: log decisions without moving anything
powershell -NoProfile -ExecutionPolicy Bypass -File .\screen-split.ps1 -DryRun
# run for real
powershell -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File .\screen-split.ps1Parameters:
| Parameter | Default | Meaning |
|---|---|---|
-GameRoots |
C:\Program Files (x86)\WeGame\, C:\Riot Games\ |
Install folders whose executables count as "game" windows |
-BigWidth / -BigHeight |
2560 / 1440 | Resolution that identifies the game monitor |
-SmallWidth / -SmallHeight |
1920 / 1080 | Resolution that identifies the work monitor |
-LogFile |
%LOCALAPPDATA%\screen-split\screen-split.log |
Decision log (auto-truncated at 300 KB) |
-DryRun |
off | Log only, never move windows |
To start it at logon, register a scheduled task with trigger "At log on" and the "run for real" command above.
- Polls
EnumWindowsevery 300 ms (negligible CPU) and skips owned dialogs, tool windows, cloaked UWP shells, and shell classes. - Enumerates monitors live with
EnumDisplayMonitorson every pass.System.Windows.Forms.Screen.AllScreensis cached per process, and a windowless daemon never receivesWM_DISPLAYCHANGE, so the cached list goes stale after the display layout changes. - Moves with
SetWindowPos(NOZORDER|NOACTIVATE), so it never steals focus from the game.
MIT