I’ve managed to find how to generate both mouse click events and UI mouse clicks.
Here are two functions i expose to blueprints that will simulate mouse clicks for me.
In my player controller blueprint I trigger mouse down function when i do a specific hand gesture and after a short delay I trigger the mouse up function.
#include “HandTrack_PlayerController.h”
#include “Public/UnrealClient.h”
#include “Classes/Engine/Engine.h”
#include “Classes/Engine/GameViewportClient.h”
#include “InputCoreTypes.h”
#include “SlateApplication.h”
void AHandTrack_PlayerController::TriggerMouseLMBDown()
{
//trigger the mouse click event. This will fire any lmb click events within blueprints.
FViewportClient* Client = GEngine->GameViewport->Viewport->GetClient();
FKey MouseLMB = EKeys::LeftMouseButton;
Client->InputKey(GEngine->GameViewport->Viewport, 0, MouseLMB, EInputEvent::IE_Pressed);
//Get our slate application
FSlateApplication& SlateApp = FSlateApplication::Get();
//create a pointer event
FPointerEvent MouseDownEvent(
0,
SlateApp.CursorPointerIndex,
SlateApp.GetCursorPos(),
SlateApp.GetLastCursorPos(),
SlateApp.GetPressedMouseButtons(),
EKeys::LeftMouseButton,
0,
SlateApp.GetPlatformApplication()->GetModifierKeys()
);
//send the mouse event to the slate handler
TSharedPtr<FGenericWindow> GenWindow;
SlateApp.ProcessMouseButtonDownEvent(GenWindow, MouseDownEvent);
}
void AHandTrack_PlayerController::TriggerMouseLMBUp()
{
//trigger the mouse click release event
FViewportClient* Client = GEngine->GameViewport->Viewport->GetClient();
FKey MouseLMB = EKeys::LeftMouseButton;
Client->InputKey(GEngine->GameViewport->Viewport, 0, MouseLMB, EInputEvent::IE_Released);
//trigger the UI mouse click
FSlateApplication& SlateApp = FSlateApplication::Get();
FPointerEvent MouseUpEvent(
0,
SlateApp.CursorPointerIndex,
SlateApp.GetCursorPos(),
SlateApp.GetLastCursorPos(),
SlateApp.GetPressedMouseButtons(),
EKeys::LeftMouseButton,
0,
SlateApp.GetPlatformApplication()->GetModifierKeys()
);
TSharedPtr<FGenericWindow> GenWindow;
SlateApp.ProcessMouseButtonUpEvent(MouseUpEvent);
}