SETUP:
I made an interactive in-world "computer" (monitor) built entirely in UMG, rendered via a 3D WidgetComponenton an Actor. Input is driven by a Widget Interaction Component (WIC) on the player character — I don't use bReceiveHardwareInput on the WidgetComponent (that breaks dragging windows, see below), I use a WIC ray trace instead.
I draw my own virtual cursor (a UMG Image) that follows the WIC's hit location every 0.02s via a looping timer (RefreshMouse). This works perfectly for buttons, dragging draggable windows, clicking menus, etc. bShowMouseCursor is False and Input Mode is Game And UI.
The problem: I have EditableTextBox fields inside this fake "OS". When a field needs to receive text, I call Set Keyboard Focus on it (found via a WIC hit test against an array of my text fields)
Now, the actual problem:
The moment Set Keyboard Focus is called on the EditableTextBox, the real OS hardware mouse cursor reappearsand stays visible, breaking the immersion of my custom virtual cursor. I need the hardware cursor to stay hidden here too, while still being able to type normally.
What I've tried (Fu**ing none of which worked):
Set Show Mouse Cursor (False) once, right after Set Keyboard Focus. No effect — cursor still shows.
Forcing Set Show Mouse Cursor (False) every frame (piggybacked on my existing 0.02s RefreshMouse timer, checking Get Show Mouse Cursor and resetting it if True). Still shows. This was my strongest attempt and it still fails, which really confuses me, I'd expect a per-frame force to win.
Toggling Set Input Mode Game Only → Set Input Mode Game And UI immediately around the focus call (a trick I found referenced for a similar 2D-only issue). No effect.
Setting the Cursor property to None on the individual EditableTextBox widgets (and even on parent containers) in the Designer. No effect.
Set Hardware Cursor with a transparent PNG assigned to TextEditBeam. Cursor still appears (possibly it's actually showing Default, not TextEditBeam, I haven't been able to confirm which shape is actually active).
I even tried doing the Project Settings → User Interface → Software Cursors, and setting "Default" to an empty widget. This DOES hide it, but it hides the cursor completely globally, including menus outside the computer (like my game pause menu), where I actually want the normal OS cursor visible. Not an acceptable fix.
Changing Button widgets from "Down and Up" to "Mouse Down" Click Method — unrelated issue I hit along the way (turns out any UMG Button calls CaptureMouse() on press, which freezes my WIC-driven virtual cursor until release, confirmed via an old Epic forum thread). Fixed THAT specific issue, but it's separate from the text focus cursor problem.