Ive been trying to deal with this too. To solve the UMG eating input like mouse clicks on controls and other things I have done the following:
Made my own User Widget class that inherits from UUserWidget and made sure all my screens use this as their parent.
Implement the two following functions:
virtual FReply NativeOnPreviewKeyDown(const FGeometry& InGeometry, const FKeyEvent& InKeyEvent) override;
virtual FReply NativeOnPreviewMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override;
These two are called whenever the widget or a child widget of this user widget are about to get an input call on them. The purpose of these is to intercept and handle the event yourself, which will cause the button or other input widget action to not happen.
You can also use this to just listen to the event for any other purpose but allow the actual widget input to happen by just returning the super result.
Note you could do this in blueprints as well, as this function is a BlueprintImplementableEvent and you could create a parent userwidget blueprint instead and make sure all of your others are reparented to that.
So to make a umg screen which listens for any input, implement the preview commands to handle child widgets taking that input and then make sure you have the user widget as focusable, and then implement the other input events:
OnKeyDown
OnAnalogValueChanged
OnMouseWheel
OnMouseButtonDown
OnMouseMove
That should be enough to get you a rebinding screen.