Easy Monitor Switcher Documentation

EASY MONITOR SWITCHER DOCUMENTATION

1. OVERVIEW

Easy Monitor Switcher is a code only Unreal Engine plugin for detecting Windows monitors and moving a game window to a selected display. It supports Unreal Engine 5.6, 5.7, and 5.8 on Win64.

The recommended API uses a stable Monitor ID and a World Context Object. The original four Blueprint nodes remain available for existing projects.

2. ENABLING THE PLUGIN

After obtaining the plugin through Fab, open Edit Plugins, search for Easy Monitor Switcher, enable it, and restart Unreal Editor if requested. Blueprint nodes appear under the Easy Monitor Switcher category.

3. RECOMMENDED BLUEPRINT WORKFLOW

1. Call Get All Monitors when opening your display settings menu. 2. For each array entry, use Monitor Name as the player facing label. 3. Store Monitor ID as the actual selection value. 4. Call Switch To Monitor By ID with the selected Monitor ID. 5. Use Borderless Fullscreen unless your packaged game specifically needs Exclusive Fullscreen. 6. Check the Boolean return value. If it is false, display or log Out Failure Reason. 7. Refresh Get All Monitors after Windows connects, disconnects, or rearranges displays.

Do not permanently identify a monitor only by Monitor Index. Indexes describe the current snapshot and can change when the display topology changes. Names can also be duplicated. Monitor ID is the safest available identifier.

4. WINDOW MODES

Borderless Fullscreen (Recommended)

Covers the complete target monitor without an exclusive display mode transition. Recommended for most games, settings menus, alt tabbing, and PIE window testing.

Windowed

Keeps the game in normal windowed mode. Fill Work Area in Windowed = true sizes the outer window inside the usable desktop area, excluding taskbars and docked toolbars. Fill Work Area in Windowed = false preserves the current client size when possible, centers it, and clamps it to the target work area.

Exclusive Fullscreen

Requests Unreal’s exclusive fullscreen mode. Available only for a non PIE game viewport that owns global game user settings. Use Borderless Fullscreen while testing in PIE.

5. BLUEPRINT API

Get All Monitors

Returns an array of Monitor Display Info structures for active, attached, usable Windows displays. Mirroring only or unusable pseudo displays are excluded. The array is ordered deterministically with the primary display first.

Switch To Monitor By ID (Recommended)

Inputs:

World Context Object: Supplied automatically in normal Blueprint graphs. Monitor ID: Read from Get All Monitors. Window Mode: Borderless Fullscreen, Windowed, or Exclusive Fullscreen. Fill Work Area in Windowed: Used only for Windowed mode. Default: true. Save Game User Settings: Saves the complete UGameUserSettings object after a successful switch. Default: false.

Outputs:

Return Value: true only when the requested monitor and mode were achieved and verified. Out Failure Reason: A description of why the operation failed.

Get Current Monitor Info For Context (Recommended)

Uses the World Context Object to locate the correct game viewport. It returns the complete Monitor Display Info structure, a success Boolean, and an actionable failure reason.

Get Monitor Index by ID

Resolves a saved Monitor ID to its index in the current monitor snapshot. Returns 1 when the ID is empty or no longer available.

Legacy Nodes

Switch To Monitor: Uses the current monitor index and a Fullscreen Boolean. In PIE, fullscreen uses safe borderless mode; a standalone game can use exclusive fullscreen. Get Current Monitor Info: Returns the current monitor index and display name for an unambiguous play world. Get Monitor Index by Name: Resolves a current name, device name, ID, or compatible legacy label. Returns 1 instead of choosing arbitrarily when a name is ambiguous. Get All Monitors: Shared by both workflows.

6. MONITOR DISPLAY INFO FIELDS

Monitor Index: Temporary index in the current deterministic snapshot. Monitor Name: Friendly label containing the display name and resolution. Duplicate models are disambiguated when possible. Monitor ID: Stable Windows hardware/interface identifier used by the recommended switching node. Device Name: Windows display endpoint such as \\.\DISPLAY1. Position X / Position Y: Top left location in the Windows virtual desktop. Negative coordinates are valid. Width / Height: Full display dimensions in pixels. Is Primary: Whether Windows marks the display as primary. Work Area Position X / Y: Top left usable desktop position. Work Area Width / Height: Usable dimensions after taskbars and docked toolbars are excluded. DPI Scale: Desktop scaling factor reported for that monitor.

7. MULTIPLAYER AND PIE

Monitor selection is local presentation behavior and is not replicated. Each client should execute the switch locally from its own settings menu, Player Controller, HUD, widget, or other locally owned logic.

A dedicated server has no display window and cannot switch monitors. A listen server host can switch its own local window. Do not send one player’s display choice to every client through a multicast RPC. In Multi PIE or multiple game window tests, use Switch To Monitor By ID and Get Current Monitor Info For Context so Unreal selects the viewport belonging to that world. Embedded Selected Viewport PIE cannot be moved as an independent operating system window. Use New Editor Window PIE or Standalone Game.

8. SAFE SETTINGS BEHAVIOR

Save Game User Settings is disabled by default. A successful switch updates the necessary runtime display state without calling the broad Apply Settings operation that can apply unrelated pending quality, VSync, HDR, audio, or scalability changes.

Enable Save Game User Settings only after the player confirms the choice, for example with an Apply and Save button. Unreal’s SaveSettings function writes the complete UGameUserSettings object, including unrelated settings currently stored in it.

9. FAILURE AND RECOVERY BEHAVIOR

The plugin validates the target before and during switching, then verifies the final native monitor and window mode. It returns false when the request was not achieved.

Handled cases include:

Empty, invalid, or disconnected Monitor ID. Invalid monitor index or window mode value. Monitor disconnection or rearrangement during a switch. Duplicate friendly monitor names. Mixed DPI monitor layouts. Monitors located at negative virtual desktop coordinates. Taskbars and docked desktop toolbars. Minimized or maximized game windows. Missing, hidden, destroyed, embedded, or ambiguous viewport windows. Commandlets, headless processes, and dedicated servers.

When a transition fails after changing the window, the plugin attempts to restore a visible windowed window on the primary monitor.

10. EXAMPLE SETTINGS MENU LOGIC

On Menu Open:

Get All Monitors For Each Loop add Monitor Name to the UI and retain the matching Monitor ID.

On Player Selection:

Selected Monitor ID Switch To Monitor By ID Borderless Fullscreen branch on Return Value.

On Success:

Update the selected UI state. Save Game User Settings only if the player chose Apply and Save.

On Failure:

Show Out Failure Reason and call Get All Monitors again so the UI reflects the current Windows display topology.

11. C++ USAGE

Add EasyMonitorSwitcher to the dependency list of the consuming module, then include:

include "EasyMonitorSwitcherBPLibrary.h"

Example inside a UObject with a valid world context:

TArray<FMonitorDisplayInfo Monitors = UEasyMonitorSwitcherBPLibrary::GetAllMonitors(); if (!Monitors.IsEmpty()) { FString FailureReason; const bool bSwitched = UEasyMonitorSwitcherBPLibrary::SwitchToMonitorById( this, Monitors[0].MonitorId, EEasyMonitorWindowMode::BorderlessFullscreen, true, false, FailureReason); }

The library and Monitor Display Info structure are exported for external C++ modules.

12. TROUBLESHOOTING

No monitors are returned

Confirm the game is running on Win64 with an active Windows desktop session. Remote, mirroring only, or pseudo display outputs may intentionally be excluded.

Switching returns false in PIE

Read Out Failure Reason. Use New Editor Window PIE or Standalone Game instead of Selected Viewport. Use Borderless Fullscreen rather than Exclusive Fullscreen.

A saved monitor is no longer found

The display was disconnected, reconnected through a different hardware path, or the Windows topology changed. Refresh Get All Monitors and let the player select again.

The wrong multiplayer machine changes display

Execute the node locally on the intended client. Monitor switching is not a replicated gameplay action.

Windowed mode does not cover the taskbar

This is expected when Fill Work Area in Windowed is enabled. Use Borderless Fullscreen to cover the complete display.

13. PERFORMANCE

The plugin has no continuously ticking actor or component. Monitor enumeration and switching work occurs only when its functions are called. Get All Monitors should normally be called when opening or refreshing a display settings menu, not every frame.

Support: https://discord.gg/9Zc4wbwqG9