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

这篇具有很好参考价值的文章主要介绍了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类中的方法文章来源地址https://www.toymoban.com/news/detail-666388.html

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

到了这里,关于UE5 运行时捕捉外部窗口并嵌入到主窗口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【UE5】蓝图UI控件菜单锚(Menu Anchor)的使用与浮动详情窗口的制作

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 最近在做毕设,一直在苦恼要怎么精准地把浮动的详情窗口放在图标的一边,就比如下图中的效果 本来也有想过直接获取控件在屏幕上的位置来计算浮动窗口的生成位置,但神奇的是蓝图似乎没有这个

    2024年02月11日
    浏览(57)
  • ue4.27空项目打包不卡ue5.1空项目打包运行卡的要命研究测试

    知乎上有人提问 lumen是如何做到不卡顿的,我却不以为然,我的显卡虽然算不上好显卡,但是也不至于独立显卡一个空项目都玩不起吧,打个cf,玩腾讯模拟器和平精英吃鸡肯定还是会很流畅的. 一个空项目都卡,怎么能说是我电脑配置问题呢??? 再来看提示 image.png image.png 反射设置的

    2023年04月21日
    浏览(58)
  • 初学UE5,UE4的教程适用UE5吗?

    UE5是最近推出的一款游戏引擎,相较于UE4而言,它有着更好的性能和灵活的工作流程,同时也引入了一些新的功能。对于一些游戏开发初学者来说,他们可能会想知道,是否可以通过UE4的教程来学习UE5。在这里,我们将介绍一下这个问题。 首先,UE5和UE4之间确实存在一些相通

    2024年02月06日
    浏览(53)
  • UE5 UDP通信 UE4.21-UE5.1

    目录 客户端,发送数据 1.建立字符串变量UDPConnection,绑定连接事件  2.连接初始化  3.发送数据  4.关闭UDP服务  服务器,接收数据 1.绑定连接事件  2.绑定数据接收事件  3.开启UDP服务  4.返回数据  5.关闭UDP服务   需要提供远程端IP地址和端口号 0.0.0.0表示监听所有ip,端口

    2024年02月15日
    浏览(77)
  • 【UE5】vsCode 调试 UE5 PuerTs

    配置PuerTs的步骤这里不赘述。 2.1 打开项目 正常来说,直接打开项目可以看到如下画面 如果直接点击运行,可以发现下方的 Output Log 窗口已经开始 Print 了很多案例。 是因为该项目默认执行的是QuickStart.ts。 2.2 打开TsGameInstance.cpp 3.1 在VsCode找到QuickStart.ts,随便断一个点 (这里

    2023年04月09日
    浏览(36)
  • UE5学习笔记(1)——从源码开始编译安装UE5

    0.1 在windows的话,建议装一个Git bash,同时还要有自己的github账号,注册github账号这里就不再赘述了,安装git bash后,设置自己的github账号。或者在windows装一个WSL。 0.2 把自己的github账号关联Epic官方,必须关联之后才能下载Unreal的源码。关联方式见官方教程 0.3 安装VS 2022,这里

    2024年02月08日
    浏览(52)
  • 【UE5】解决UE5无法播放mp4视频

    最近接手的项目需要把项目从UE4中迁移至UE5.0,其中遇到了一个mp4视频无法播放的bug,这里做一下记录。 在官方论中有提到过这个bug,https://forums.unrealengine.com/t/media-textures-wont-display-video-in-ue5-preview-1-while-using-directx-12/503980/2 按照常规的方法播放视频在MediaPlay的Play节点会返回

    2024年01月17日
    浏览(58)
  • 【UE5】如何在UE5.1中创建级联粒子系统

    1. 可以先新建一个actor蓝图,然后在该蓝图中添加一个“Cascade Particle System Component” 2. 在右侧的细节面板中,点击“模板”一项中的下拉框,然后点击“Cascade粒子系统(旧版)” 然后就可以选择在哪个路径下创建级联粒子系统了

    2024年02月06日
    浏览(37)
  • 【UE】UE5 学习笔记

    快捷键 快捷键 描述 F 定位关一卡对象:双击游戏对象名字或选游戏对象名字 鼠标中键 移动视野 alt+鼠标左键移 旋转视野 滑动鼠标滚轮 缩放视野 alt+鼠标右键拖动鼠标 缩放视野 鼠标左键移动鼠标 前后漫游 WASD+鼠标右键 自由漫游 漫游时滑动鼠标滚轮 调节漫游速度 选中要克隆

    2023年04月14日
    浏览(51)
  • 【UE5】UE5与Python Socket通信中文数据接收不全

    最近在使用UE的Socket模块与Python服务器进行通信时遇到了一些坑,特此记录一下。 先来复现一下问题,这里只截取关键代码。 UE端: Python端: 运行结果: UE端发送的数据: Python端接收到数据: 可以看到数据容量并没有超出缓存上限,且Python端接收的数据都有做utf-8的编码转

    2024年02月14日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包