EDIT: As @Benmolenaar1 correctly pointed out, this only works in UE 5.4+ so bear that in mind. He has posted his solution which should work pre 5.4.
I have had the same problem using CommonUI. UCommonUIActionRouterBase creates a FCommonAnalogCursor to simulate mouse clicks when using a Gamepad. This is how it makes the entire UI navigation work with Gamepad. FCommonAnalogCursor has a virtual function
virtual bool ShouldVirtualAcceptSimulateMouseButton(const FKeyEvent& InKeyEvent, EInputEvent InputEvent);
that controls whether Accept inputs (Face Button Bottom) should be emulated as mouse clicks. For me, it was enough to override this and only return true when the Current InputMode was not GameOnly.
Here is my code:
.h
#pragma once
#include <CoreMinimal.h>
#include <Input/CommonUIActionRouterBase.h>
#include <Input/CommonAnalogCursor.h>
#include "CcCommonUIActionRouter.generated.h"
class FCcCommonAnalogCursor : public FCommonAnalogCursor
{
public:
FCcCommonAnalogCursor(const UCommonUIActionRouterBase& InActionRouter) : FCommonAnalogCursor(InActionRouter) {}
public:
bool ShouldVirtualAcceptSimulateMouseButton(const FKeyEvent& InKeyEvent, EInputEvent InputEvent) const override;
};
UCLASS()
class UCcCommonUIActionRouter : public UCommonUIActionRouterBase
{
GENERATED_BODY()
protected:
TSharedRef<FCommonAnalogCursor> MakeAnalogCursor() const override;
};
.cpp
#include "CcCommonUIActionRouter.h"
#include <Engine/EngineBaseTypes.h>
#include <Input/Events.h>
bool FCcCommonAnalogCursor::ShouldVirtualAcceptSimulateMouseButton(const FKeyEvent& InKeyEvent, EInputEvent InputEvent) const
{
return ActionRouter.GetActiveInputMode() != ECommonInputMode::Game;
}
TSharedRef<FCommonAnalogCursor> UCcCommonUIActionRouter::MakeAnalogCursor() const
{
return FCommonAnalogCursor::CreateAnalogCursor<FCcCommonAnalogCursor>(*this);
}
Note that you need to include Slate as a dependency in your Build.cs.