UE5 运行时捕捉外部窗口并嵌入到主窗口

UE5 运行时捕捉外部窗口并嵌入到主窗口的一种方法

创建一个Slate类用于生成一个窗口

cpp 复制代码
.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Widgets/SCompoundWidget.h"

/**
 * 
 */
class NEWWINDOWTEST0822_API SCreateNewWindow : public SCompoundWidget
{
public:
	SLATE_BEGIN_ARGS(SCreateNewWindow)
	{}
	SLATE_END_ARGS()

	/** Constructs this widget with InArgs */
	void Construct(const FArguments& InArgs);

	static void CreateAAA();
};
cpp 复制代码
.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "SCreateNewWindow.h"
#include "SlateOptMacros.h"

BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SCreateNewWindow::Construct(const FArguments& InArgs)
{
	/*
	ChildSlot
	[
		// Populate the widget
	];
	*/
}

void SCreateNewWindow::CreateAAA()
{
	TSharedPtr<SWindow> NewWin = SNew(SWindow).ClientSize(FVector2D(800,600))
					.Title(FText::FromString(TEXT("AAAAA")));

	FSlateApplication::Get().AddWindow(NewWin.ToSharedRef());
}

END_SLATE_FUNCTION_BUILD_OPTIMIZATION

创建一个Actor类,用于调用Slate类中的方法

cpp 复制代码
.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"

UCLASS()
class NEWWINDOWTEST0822_API AMyActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AMyActor();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	UFUNCTION(BlueprintCallable,Category = "Function")
	static void SpawnWindow();

	UFUNCTION(BlueprintCallable,Category = "Function")
	static void findAAA(FString AAAname);

	static void OnMainWindowClosed();

};
cpp 复制代码
.cpp


#include "MyActor.h"
#include "Windows/AllowWindowsPlatformTypes.h"
#include "SCreateNewWindow.h"

FDelegateHandle MainWindowClosedHandle; // 用于存储主窗口关闭事件的句柄
HWND OtherWindowHandle = nullptr; // 嵌入的子窗口句柄

// Sets default values
AMyActor::AMyActor()
{
    // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = true;
}

// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
    Super::BeginPlay();
}

// Called every frame
void AMyActor::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
}

void AMyActor::SpawnWindow()
{
    SCreateNewWindow::CreateAAA();
}

void AMyActor::findAAA(FString AAAname)
{
    void* winhandle = GEngine->GameViewport->GetWindow()->GetNativeWindow()->GetOSWindowHandle();

    // 进行类型转换,获取主窗口句柄
    HWND MainWindowHwnd = static_cast<HWND>(winhandle);

    if (MainWindowHwnd)
    {
        const WCHAR* WindowName = *AAAname;
        HWND otherWindow = FindWindowW(NULL, WindowName);

        // 设置子窗口位置
        SetWindowPos(otherWindow, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOZORDER);

        // 获取子窗口当前样式
        LONG style = GetWindowLong(otherWindow, GWL_STYLE);

        // 清除窗口边框样式
        style &= ~(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX);

        // 添加无边框样式和可移动样式
        style |= WS_POPUP | WS_BORDER;

        // 设置子窗口样式
        SetWindowLong(otherWindow, GWL_STYLE, style);

        // 将子窗口嵌入到主窗口中
        SetParent(otherWindow, MainWindowHwnd);

        // 存储嵌入的子窗口句柄
        OtherWindowHandle = otherWindow;

        // 注册主窗口关闭事件
        MainWindowClosedHandle = FCoreDelegates::OnPreExit.AddStatic(&AMyActor::OnMainWindowClosed);
    }
}

void AMyActor::OnMainWindowClosed()
{
    if (OtherWindowHandle)
    {
        DestroyWindow(OtherWindowHandle);
    }

    // 取消主窗口关闭事件的注册
    FCoreDelegates::OnPreExit.Remove(MainWindowClosedHandle);
}
相关推荐
caoerzhong20 分钟前
跨境海外仓怎么管:JeeWMS 开源 Java 仓库管理系统打通头程、海外仓与尾程
java·开发语言·开源
MayBaymax26 分钟前
Elasticsearch 原理与用法
java·elasticsearch
马剑威(威哥爱编程)28 分钟前
【AI全栈后端12-02】Spring Boot 跑通第一个 AI 对话接口:HR 政策问答机器人实战
java·人工智能·spring boot·机器人
zach30 分钟前
Vue/React SPA 打包部署后,子路由刷新 401 未登录问题彻底解决
前端·nginx·next.js
IT枫斗者枫哥30 分钟前
AI返回合法JSON,字段就可信吗?给抽取结果补一道业务校验
java·人工智能·后端
旋生万物31 分钟前
素数螺旋映射 $z_n=n^{1+i}$ 的角分布统计检验与零模型对比
大数据·前端·人工智能·算法·云原生·螺旋生成论·螺旋相位
用户31268748772032 分钟前
Java IO/NIO/AIO 演进:从 BIO 到 Netty 的底层逻辑
java
亿元程序员33 分钟前
游戏引擎都没用!纯AI又上线了一款蚂蚁搬家小游戏!
前端
IT枫斗者枫哥34 分钟前
同一个requestId换了参数,为什么不能直接返回旧结果?
java·后端
天天被压力35 分钟前
【别再到处找免费股票数据API了:官方204个接口,32篇一次讲透 #06】Python实时行情总报错?五档盘口+逐笔一次跑通
java·人工智能·python