Foop is a small .NET 10 Windows desktop utility for multi-monitor setups. It lists active desktop windows and moves a selected window, centered, onto any active monitor.
- Creates one Foop window per active monitor: secondary monitors use a minimized taskbar button; the primary monitor uses the notification area (system tray) instead.
- Rebuilds those entries when displays are connected, disconnected, switched on, or switched off.
- Shows only visible, user-facing top-level desktop windows; Foop, tool windows, owned dialogs, and cloaked virtual-desktop windows are excluded.
- Offers Detail and Grid views and can list windows by application name or window title.
- Moves the selected window to the current monitor with Foop! or a double-click.
- Opens an app action dialog on right-click to send the app to any active monitor.
- Stores per-app monitor preferences and automatically moves the first running instance to the chosen monitor.
- Marks apps with an active monitor preference using a red monitor-number badge.
- Restores minimized or maximized windows before moving them.
- Keeps the moved window inside the target monitor's working area.
- Persists view mode, window layout, tray behavior, startup behavior, and app monitor preferences in the current user's profile.
- Supports Start with Windows, Start minimized (logon autostart only), Auto-Minimize on Fooping, Minimize to Tray, and Close to Tray.
- Runs as a single instance per Windows session.
- Reports Windows access denial, which can occur when the target application runs elevated and Foop does not.
Windows still controls how application buttons are grouped or duplicated through its multi-monitor taskbar settings. Foop places a real top-level window on each active monitor so modes that show buttons on the window's monitor work as intended.
- Windows 10 or Windows 11
- .NET 10 Desktop Runtime for running
- .NET 10 SDK for building
The application uses only .NET/WPF and Windows APIs. It has no external NuGet package dependencies.
Build the solution:
dotnet build .\Foop.slnx --configuration ReleaseTo build and then run the test project in one step, use Scripts\verify.ps1. It calls build.ps1 (Release dotnet build of Foop.slnx) and Scripts\test.ps1 (dotnet run on tests\Foop.Tests), and writes logs to artifacts\logs:
pwsh -NoProfile -File .\Scripts\verify.ps1dotnet run --project .\src\Foop\Foop.csprojMinimize to Tray and Close to Tray independently control whether minimizing or closing any Foop window hides it in the notification area. Use Exit Foop in the tray menu to quit.
Use Settings → Create Start Menu icon… to create a shortcut for the current user or all users. The all-users option requests administrator rights.
The same operation is available through PowerShell. In a downloaded release, keep the script beside Foop.exe. In the source repository, build Foop first. Then create the shortcut for the current user:
pwsh -NoProfile -File .\create-start-menu-shortcut.ps1 -Scope CurrentUserTo create the shortcut for all users, run PowerShell as administrator:
pwsh -NoProfile -File .\create-start-menu-shortcut.ps1 -Scope AllUsersThe shortcut targets the Release build and uses the executable's icon.
The manual Release workflow builds and tests Foop with .NET 10, publishes a self-contained single-file Windows x64 application, and creates a GitHub release with a ZIP archive.
Before starting it:
- Set the release version in
src/Foop/Foop.csproj. - Add the matching
## [X.Y.Z]entry toCHANGELOG.md. - Commit and push the changes to
main. - Open Actions → Release → Run workflow and enter the version without the
vprefix.
The workflow creates the corresponding vX.Y.Z tag and release.
