UE4 游戏窗口前台后台监听
【原创文章 转载请注明出处】
最近有个需求,记录在窗口切到后台和切回前台时的时间。找了很久,没有具体的方法,光看到有个委托事件也不知道怎么用。查资料+测试了1天,感谢各位大佬对UE 委托DELEGATE的介绍,现把我也把自己关于这部分功能的详细代码方上来,做个记录吧。
由于喜欢在蓝图中实现具体逻辑,所以有些代码可能会有些多余。
这部分比较乱完整的代码会在下面放出来。如果觉得有帮助请给我点个赞,哈哈
就不新建文件了,用自己的项目说了,
在CEditorGameInstance.h中
在开头出 通过委托宏自己定义2个动态多播返回值为viod的委托类型
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnWindowActive);
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnWindowDeActive);
在类中声明2个公有变量,开放给蓝图使用,之后会在蓝图中对这2个事件进行绑定。
UPROPERTY(BlueprintAssignable)FOnWindowActive onWindowActivatedEvent;
UPROPERTY(BlueprintAssignable)FOnWindowDeActive onWindowDeactivatedEvent;
之后就是获取窗口的通知,UE自带的窗口通知事件是由SWindow发起的,我们先参考一下有哪些类型 SWindow.h
/** Notification that a window has been activated */
DECLARE_DELEGATE( FOnWindowActivated );
DECLARE_MULTICAST_DELEGATE( FOnWindowActivatedEvent );/** Notification that a window has been deactivated */
DECLARE_DELEGATE( FOnWindowDeactivated );
DECLARE_MULTICAST_DELEGATE( FOnWindowDeactivatedEvent );/** Notification that a window is about to be closed */
DECLARE_DELEGATE_OneParam( FOnWindowClosed, const TSharedRef<SWindow>& );/** Notification that a window has been moved */
DECLARE_DELEGATE_OneParam( FOnWindowMoved, const TSharedRef<SWindow>& );/** Override delegate for RequestDestroyWindow */
DECLARE_DELEGATE_OneParam( FRequestDestroyWindowOverride, const TSharedRef<SWindow>& );/** Called when we need to switch game worlds for a window */
DECLARE_DELEGATE_RetVal_OneParam( int32, FOnSwitchWorldHack, int32 );
我们需要用到的是这两个:
DECLARE_DELEGATE( FOnWindowActivated );
DECLARE_DELEGATE( FOnWindowDeactivated );
回到CEditorGameInstance.h中
在声明2个变量
FOnWindowActivated onWindowActivedHandle;
FOnWindowDeactivated onWindowDeactivedHandle;
这样需要的变量就已经定义完了,如图:
之后写绑定函数
UFUNCTION(BlueprintCallable, meta = (DisplayName = "Handle Application Actived"), Category = "Application")void HandleOnWindowActived();//获取窗口被激活时的信息
UFUNCTION(BlueprintCallable, meta = (DisplayName = "Handle Application Deactived"), Category = "Application")void HandleOnWindowDeactived();//获取窗口失效时的信息//获得各自信息后调用委托事件(这样蓝图中已经绑定事件的话就会收到信息)void OnRequestWindowActived();void OnRequestWindowDeactived();
//---------------窗口激活时的绑定------------------
void UCEditorGameInstance::HandleOnWindowActived()
{//为Handle绑定函数onWindowActivedHandle.BindUObject(this, &UCEditorGameInstance::OnRequestWindowActived);if (GEngine){//为SWindow设置句柄TSharedPtr<SWindow> Application = GEngine->GameViewport->GetWindow();Application->SetOnWindowActivated(onWindowActivedHandle);UE_LOG(LogTemp, Log, TEXT("Application request Actived is handled!"));}else{UE_LOG(LogTemp, Warning, TEXT("Can not get viewport reference, handle application Actived request failed!"));}
}void UCEditorGameInstance::OnRequestWindowActived()
{UE_LOG(LogTemp, Log, TEXT("Application request OnRequestWindowActived is handled!---dcf"));if (onWindowActivatedEvent.IsBound()){onWindowActivatedEvent.Broadcast();}
}
//---------------窗口失效时的绑定------------------
void UCEditorGameInstance::HandleOnWindowDeactived()
{onWindowDeactivedHandle.BindUObject(this, &UCEditorGameInstance::OnRequestWindowDeactived);if (GEngine){TSharedPtr<SWindow> Application = GEngine->GameViewport->GetWindow();Application->SetOnWindowDeactivated(onWindowDeactivedHandle);UE_LOG(LogTemp, Log, TEXT("Application request Deactived is handled!"));}else{UE_LOG(LogTemp, Warning, TEXT("Can not get viewport reference, handle application Deactived request failed!"));}
}void UCEditorGameInstance::OnRequestWindowDeactived()
{UE_LOG(LogTemp, Log, TEXT("Application request OnRequestWindowDeactived is handled!---dcf"));if (onWindowDeactivatedEvent.IsBound()){onWindowDeactivatedEvent.Broadcast();}
}
编译启动项目,到EditorGameInstance蓝图创建函数
到自己的项目的第一个Widget界面,初始化的时候调用刚才的方法(我的是登录界面Login_bp)
测试 启动游戏,点击其他区域 在点回窗口 看到日志已经打印出来了
完整的C++代码:
.h
#include "Runtime/SlateCore/Public/Widgets/SWindow.h"DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnWindowActive);
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnWindowDeActive);UCLASS()
class AJDR_API UCEditorGameInstance : public UGameInstance
{GENERATED_UCLASS_BODY()public:UFUNCTION(BlueprintCallable, meta = (DisplayName = "Handle Application Actived"), Category = "Application")void HandleOnWindowActived();void OnRequestWindowActived();UFUNCTION(BlueprintCallable, meta = (DisplayName = "Handle Application Deactived"), Category = "Application")void HandleOnWindowDeactived();void OnRequestWindowDeactived();public:FOnWindowActivated onWindowActivedHandle;FOnWindowDeactivated onWindowDeactivedHandle;UPROPERTY(BlueprintAssignable)FOnWindowActive onWindowActivatedEvent;UPROPERTY(BlueprintAssignable)FOnWindowDeActive onWindowDeactivatedEvent;}
.cpp
void UCEditorGameInstance::HandleOnWindowActived()
{onWindowActivedHandle.BindUObject(this, &UCEditorGameInstance::OnRequestWindowActived);if (GEngine){TSharedPtr<SWindow> Application = GEngine->GameViewport->GetWindow();Application->SetOnWindowActivated(onWindowActivedHandle);UE_LOG(LogTemp, Log, TEXT("Application request Actived is handled!"));}else{UE_LOG(LogTemp, Warning, TEXT("Can not get viewport reference, handle application Actived request failed!"));}
}void UCEditorGameInstance::OnRequestWindowActived()
{UE_LOG(LogTemp, Log, TEXT("Application request OnRequestWindowActived is handled!---dcf"));if (onWindowActivatedEvent.IsBound()){onWindowActivatedEvent.Broadcast();}
}void UCEditorGameInstance::HandleOnWindowDeactived()
{onWindowDeactivedHandle.BindUObject(this, &UCEditorGameInstance::OnRequestWindowDeactived);if (GEngine){TSharedPtr<SWindow> Application = GEngine->GameViewport->GetWindow();Application->SetOnWindowDeactivated(onWindowDeactivedHandle);UE_LOG(LogTemp, Log, TEXT("Application request Deactived is handled!"));}else{UE_LOG(LogTemp, Warning, TEXT("Can not get viewport reference, handle application Deactived request failed!"));}
}void UCEditorGameInstance::OnRequestWindowDeactived()
{UE_LOG(LogTemp, Log, TEXT("Application request OnRequestWindowDeactived is handled!---dcf"));if (onWindowDeactivatedEvent.IsBound()){onWindowDeactivatedEvent.Broadcast();}
}
UE4 游戏窗口前台后台监听相关推荐
- Android后台监听全局屏幕旋转
最近有个需求就是程序在后台监听手机的屏幕的旋转方向,废话不多说,先看看效果: 摸摸头~,既然是监听屏幕的旋转方向,那就需要要弄明白Android的屏幕是由谁控制的?,方向又是怎么控制的? 带着问题我们 ...
- java完成键盘动作_java实现鼠标和键盘动作后台监听
有的时候需要我们对鼠标和键盘的动作(鼠标的移动,键盘的点击)进行监听,比如按键记录,鼠标坐标记录等. 我们使用JNA来实现以上的操作 tips:JNA类库使用一个很小的本地类库sub 动态的调用本地代 ...
- java用jintellitype和jna两种方式实现鼠标键盘后台监听
下载相关dll文件 我的目录结构 依赖jintellitype-1.3.9.jar方式实现 需要一个jar文件和两个c编写dll文件,注意:d ...
- android如何使用BroadcastReceiver后台实现来电通话记录的监听并存取到sqllite数据库通过Contentprovilder实现接口...
BroadcastReceiver 是android四大组件的一个,本质上是一种全局的监听器,用于监听全局的广播消息.下面实现了后台监听android手机通话记录.本demo分两个程序,第一个程序是设 ...
- Android 来电监听
最近刚接到一个需求,为BOSS做一个来电显示功能,查找号码库显示姓名角色. 一.查找来电监听方法 PhoneStateListener监听器类,用于监视设备上特定电话状态的变化,包括服务状态.信号强度 ...
- Android怎样监听蓝牙耳机的按键事件
Android怎样监听蓝牙耳机的按键事件 写在前面: 直接想要代码非常easy,你直接把滚动栏拉到最底端就能够看到.假设想要十分地了解为什么,那就依照我规划的一步一步来理解.下面測试环境以手头上有的「 ...
- Android如何监听蓝牙耳机的按键事件(转)
源: Android如何监听蓝牙耳机的按键事件 写在前面: 直接想要代码很简单,你直接把滚动条拉到最底端就可以看到.如果想要十分地了解为什么,那就按照我规划的一步一步来理解.以下测试环境以手头上有的「 ...
- android 监听手机电量变化
今天,简单讲讲如何监听手机电量的变化. 监听电量是不能静态注册的. 后来上网搜索,发现有五个不能静态注册的广播,这里记录一下,免得下次再后知后觉的发现并惊讶于自己的笨拙. 不能静态注册的广播: and ...
- php代码实现tp5监听队列,thinkPHP5的队列使用
1.下载tp5的完全包,里面含有queue的扩展.如果没有执行如下命令: composer require topthink/think-queue 1.1.4 2.执行第二步: 执行的队列: nam ...
最新文章
- 高性能mysql的事物隔离级别
- Highmaps网页图表教程之图表配置项结构与商业授权
- GridView使用技巧.txt
- Python封装发送信息到钉钉群
- [C++STL]queue容器用法介绍
- c语言入门函数大全,C语言函数大全(适合初学者).doc
- 赛门铁克linux安装教程,Symantec赛门铁克14.2版本服务端安装教程及配置教程(三)...
- (二)洞悉linux下的Netfilteriptables:内核中的ip_tables小觑
- 在CNDS博客中插入Latex公式
- 硬原理——DC-DC升压(BOOST)电路原理
- 怎么用python画椭圆_python画椭圆
- 自学成才秘籍!机器学习深度学习经典资料汇总
- 多项式拟合缺点_常见算法优缺点
- 《南方周末》今日发文揭开了这场抢票插件阻击战的内幕
- “读芯术”精华文章汇总:专业知识
- python3APP爬虫--爬取王者荣耀小姐姐cosplay照片(附源码)
- 【Fluent】如何快速地设置wall壁面/zones区域的边界条件boundary condition?例如当存在很多wall壁面时,快速批量地修改材料等边界条件
- python numpy求四分位距
- 永硕e盘php,永硕E盘特效代码集萃
- 【Android多媒体(重采样与混频)】从playback流程分析AudioResampler,AudioMixer
热门文章
- 数字逻辑电路(前三章简介)
- 二叉树的性质及其创建
- 学习笔记16 window service 服务的相关内容
- 基于深度强化学习的组合优化方法在工业应用中的实践
- Pandas中to_excel实现数据追加或者覆盖到Excel工作表
- 为什么日本的网页设计风格还停留在90年代?
- MATLAB中不用循环生成圆盘(圆形)/圆环掩膜矩阵
- 阻塞双端消息队列 BlockingDeque(先进先出的原则管理)
- 计算机网络与通信实验报告——HTTP协议分析
- api有哪些 javasocket_简单hello/hi程序、分析及Java Socket API与Linux Socket API对比