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

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

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

.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

// 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类中的方法

.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


#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);
}

### 回答1: 在UE4中启动第三方软件并将其嵌入窗口的过程可以通过蓝图和C++代码实现。在蓝图中,可以使用“Execute Console Command”节点来执行一些命令行命令。事先使用命令行启动第三方软件,并将其的窗口句柄获取到,然后使用“Set Parent Window”节点将其嵌入UE4窗口中。这种方法比较简单,但是需要一些命令行知识和手动启动第三方软件。 在C++代码中,可以使用Windows API的相关函数来启动第三方软件并将其嵌入UE4窗口中。首先要获取UE4窗口的句柄,然后启动第三方软件并获取其窗口句柄,最后使用API函数“SetParent”将第三方软件的窗口嵌入UE4窗口中。需要注意的是,在C++代码中使用API函数,需要一些Windows编程基础和对UE4引擎的深度理解。 无论是使用蓝图还是C++代码,在嵌入第三方软件的过程中,需要注意一些细节问题,例如窗口大小,透明度等等。同时,因为每个第三方软件的窗口操作不同,所以需要根据具体的软件特点来进行调整。嵌入第三方软件可以极大的扩展UE4的功能,让开发者可以更加灵活的进行开发。 ### 回答2: UE4是一款非常出色的游戏引擎,尤其是在游戏开发领域中广受欢迎。但随着游戏的发展和增强,开始需要调用第三方软件或为其他目的嵌入第三方软件。本文将探讨如何在UE4中启动第三方软件并嵌入窗口。 启动第三方软件 UE4引擎提供了开发者使用的许多不同功能,其中之一是System Library。这个库提供了许多关于系统功能的函数,可以通过调用这些函数来实现系统相关的任务。在我们的情况下,我们将使用System Library中的Launcher功能来启动第三方软件。 我们可以使用FPlatformProcess::CreateProc函数来启动第三方软件。这个函数需要三个参数:软件的完整路径、命令行参数和是否显示软件的标志。例如下面的代码: ```cpp FPlatformProcess::CreateProc(TEXT("C:/Program Files/ExampleApp/ExampleApp.exe"), TEXT(" -option1"), true, false, false, nullptr, 0, nullptr, nullptr); ``` 嵌入第三方软件 一旦我们启动了第三方软件,我们可能需要将其嵌入到我们的UE4应用程序中。具体地说,我们可能需要在我们的UE4窗口嵌入一个Web浏览器或视频播放器等。 要将第三方软件嵌入UE4窗口中,我们可以使用WinAPI中提供的CreateWindowEx函数。这个函数允许我们创建一个新的窗口或子窗口,并将其嵌入到我们的UE4窗口中。 下面是实现此操作的典型代码片段: ```cpp HWND ParentWindow = (HWND)SomeUE4WindowHandle; HWND ChildWindow = CreateWindowEx(WS_EX_CLIENTEDGE, _T("SomeClassName"), _T("SomeName"), WS_CHILD | WS_VISIBLE, 0, 0, 640, 480, ParentWindow, NULL, NULL, NULL); ``` 熟悉WinAPI编程的人可能很熟悉这个代码。简单地说,它使用CreateWindowEx函数创建了一个新的窗口,并将其作为子窗口嵌入到父窗口中(在本例中为SomeUE4WindowHandle)。 在这个例子中,我们创建了一个名为“SomeName”的子窗口,并将其嵌入到我们的UE4窗口中。此外,注意我们使用了WS_CHILD和WS_VISIBLE标志,这两个标志告诉Windows将窗口作为子窗口创建,并将其设置为可见。 总结 在UE4中启动第三方软件并嵌入窗口可能有点棘手,但使用System Library和WinAPI应该很容易实现。如果你需要在你的UE4应用程序中使用其他软件,这些技巧可能会帮助你实现你的目标。 ### 回答3: UE4是一款强大的游戏引擎,开发者可以通过其提供的各种工具和功能来制作出高品质的游戏。在UE4中,我们可以通过使用蓝图来实现启动第三方软件并嵌入窗口的功能,下面是步骤: 第一步:设置启动参数 在UE4中,我们可以使用命令行来启动第三方软件。因此,我们需要设置好要启动软件的路径和命令行参数。这可以使用节点“Run Program”来完成。在节点的“Executable path”输入框中填入要启动的软件路径,在“Command line arguments”输入框中填入要传递给软件的命令行参数。例如,要启动一个记事本软件,我们可以这样设置: 第二步:创建嵌入窗口UE4中,我们可以使用“UMG Widget Component”组件来创建嵌入窗口。在创建嵌入窗口之前,我们需要先在项目中打开UMG编辑器,然后创建一个新的UMG小部件来显示Windows窗口。在UMG编辑器中,我们可以自由地添加各种控件、元素等,以达到我们想要的效果。完成后,将其保存为UMG小部件。 接下来,在UE4中创建一个新的Actor,并将其浏览器组件中的Root组件替换为“UMG Widget Component”组件。然后,将我们刚才创建的UMG小部件拖动到“UMG Widget Component”组件的“Widget Class”属性中。这将使我们的UMG小部件显示在Actor的浏览器中,从而创建了嵌入窗口。 第三步:嵌入窗口和第三方软件 要将第三方软件嵌入到我们创建的UMG小部件中,我们需要使用Windows API。在UE4中,我们可以使用第三方插件“WindowsMixedReality”来直接使用Windows API。因此,我们需要先下载并安装此插件。 在UE4中,我们可以使用“Windows Mix Reality”插件的“AttachNativeWindowToWidget”函数来将第三方软件附加到我们创建的UMG小部件中。在此函数中,我们需要传入所需的参数,例如我们所启动的软件的句柄和我们的UMG小部件的句柄,以及所需的位置和大小等。这将使第三方软件显示在我们的UMG小部件中,从而实现了将第三方软件嵌入到我们的游戏引擎中。 总之,通过上述步骤,我们可以成功地在UE4中启动第三方软件并将其嵌入到我们的游戏引擎中。这将使我们的游戏引擎拥有更丰富的功能和更高的可玩性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我救我自己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值