Embed external application windows — and in-process Qt/PySide widgets — into dockable Unreal Editor panels.
View on FABTool Dock reparents native window handles, which is a Win32 operation. There is no configuration, no account, and no external dependency — install it and it works.
Tool Dock is available on FAB, Epic's official plugin marketplace.
There are two ways to use Tool Dock, and they're independent — you can use either, or both at once.
One dock holding several windows as tabs, much like browser tabs. This is a normal saved-layout editor tab, so the editor remembers where you put it.
Sometimes you don't want a shared dock — you want one specific app pinned to its own tab, with its own icon and title.
“Releasing” restores a docked window to a normal, independent desktop window at its original size and position. It does not close or terminate the application. A window is released when you:
Exposed to Python as unreal.ToolDockLibrary, and to Blueprint under the Tool Dock node category. All calls must be made from the game thread; calling from a background thread logs an error and returns False.
This is the one thing worth getting right up front. The two attach functions are not interchangeable.
attach_process_to_new_tool_dock. It searches that process's top-level windows and picks the best main-window candidate, preferring the largest non-minimized one.attach_window_to_new_tool_dock instead. PID search deliberately skips in-process windows, and winId() is a window handle, not a process id — passing it to the PID-based function will never match anything.import subprocess
import unreal
process = subprocess.Popen(["C:/Program Files/Blender Foundation/blender.exe"])
# Give the app a moment to create its main window before searching for it.
unreal.ToolDockLibrary.attach_process_to_new_tool_dock(process.pid)import unreal
from PySide6 import QtWidgets
widget = QtWidgets.QWidget()
widget.setWindowTitle("My Pipeline Tool")
widget.show()
# winId() is a window handle, not a PID - use the handle-based function.
unreal.ToolDockLibrary.attach_window_to_new_tool_dock(int(widget.winId()))import unreal
if not unreal.ToolDockLibrary.is_tool_dock_open():
unreal.ToolDockLibrary.open_tool_dock()Edit → Project Settings → Plugins → Tool Dock
| Setting | Default | Description |
|---|---|---|
| Minimized Filter | Show Minimized | Whether minimized windows appear in the capture list. Set to Hide Minimized to declutter if you keep a lot of windows minimized. |
| Include In Process Windows | On | Whether top-level windows owned by the editor's own process — Qt/PySide widgets launched from Python — are offered for capture at all. Slate's own windows are always excluded regardless. |
| Ignored Window Classes | 5 defaults | Win32 class names never offered for capture. Supports a trailing wildcard, so Chrome_WidgetWin_* ignores every Chrome window. |
| Enable Drag And Drop Capture | On | Whether dragging a window onto the panel by its title bar captures it. Turning this off leaves the + button as the only way to capture. |
SplashScreenClass), tooltips (tooltips_class32), common dialogs (#32770), and IME windows (IME, MSCTFIME UI). Add to this list if some other transient window keeps showing up.EditorPerProjectUserSettings, so changing them doesn't affect your teammates.Walkthroughs covering every feature. Click a tutorial to jump to it.
Tool Dock enabled in the Plugins browser
The two entries under Window → Tools
The empty Tool Dock panel
The capture menu, split by category
Filtering the capture list by process
An external app docked in the panel
Two windows docked as separate tabs
Switching to the second tab
Dragging a tab onto its neighbour
The per-tab close button
The release hint shown while dragging out
The drop overlay while hovering the panel
The window docked after release
The native drop hint used for in-process drags
The Attach Tool… submenu
A dedicated instance in its own tab.exe and its label from the window title, so it reads like a first-class tool tab.
Two dedicated instances docked side by side
The tab closing after its app exits
A PySide widget floating over the editor
The widget listed under In Editor
The PySide tool docked in the editor
The widget floating again after release
The Tool Dock settings panel
The minimized filter in action* — to keep a noisy application out of the list for good.
Adding a wildcard ignore pattern
Drag-and-drop capture disabledAll notable changes to Tool Dock, organized by version.
First public release. Embed external application windows and in-process Qt/PySide widgets into dockable Unreal Editor panels.
Work through these in order:
Some applications are protected by kernel-level anti-cheat drivers that silently swallow the SetWindowLongPtr style change Tool Dock relies on. The plugin reads the styles back after writing them, notices they didn't take, rolls its change back and tells you — rather than leaving you with a half-captured window. This is a hard block that no external tool can work around.
Use attach_window_to_new_tool_dockwith the widget's winId() instead. PID search intentionally skips in-process windows — and winId() is a window handle, not a process id, so passing it to the PID-based function will never match anything.
No. Tool Dock never launches, closes, or terminates anything. It only changes an existing window's style and owner. Release puts the original style, extended style, owner, and screen position back, and you get a normal desktop window again — the application never knows it moved.
Partially. The shared Tool Dock panel is a normal saved-layout tab, so its presence and position persist. The windows that were docked insideit do not — the target application isn't necessarily still running when the editor comes back up.
Dedicated instances don't persist either: their tabs are registered on the fly when you open them and are not part of the saved-layout system. Reopen them after a restart, or script it from a startup Python file.
Tool Dock clamps the restored rectangle to the current virtual desktop bounds, so a window can never be stranded fully off-screen. An unusual multi-monitor change while a window was docked can still produce a surprising result. Drag it back into view; its position isn't tracked once released.
That's deliberate. Apps that draw a custom title bar start a real OS move loop (WM_NCLBUTTONDOWN with HTCAPTION). Tool Dock detects the resulting drift and evicts the window from the dock in place, restoring its frame so the drag you already started continues naturally on a free-floating window. Resizing does not undock — that gesture is told apart and cancelled so the panel re-snaps.
No. Tool Dock is Windows-only and its module is restricted to the Win64 platform. The embedding relies on Win32 window ownership semantics that have no direct equivalent elsewhere.
Tool Dock is not affiliated with, endorsed by, or sponsored by any of the applications it can embed. It does not launch, modify, close, or terminate third-party software — it only changes an existing window's style and owner, and restores both on release.
Applications protected by kernel-level anti-cheat drivers cannot be captured. This is a hard block enforced by those drivers and no external tool can work around it; Tool Dock detects the refusal, rolls its own change back, and reports it rather than failing silently.
The developer will endeavor to keep this plugin up to date, however operating system behaviour and third-party applications may change at any time without notice and continued compatibility cannot be guaranteed.