【原创文章 转载请注明出处】

最近有个需求,记录在窗口切到后台和切回前台时的时间。找了很久,没有具体的方法,光看到有个委托事件也不知道怎么用。查资料+测试了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 游戏窗口前台后台监听相关推荐

  1. Android后台监听全局屏幕旋转

    最近有个需求就是程序在后台监听手机的屏幕的旋转方向,废话不多说,先看看效果: 摸摸头~,既然是监听屏幕的旋转方向,那就需要要弄明白Android的屏幕是由谁控制的?,方向又是怎么控制的? 带着问题我们 ...

  2. java完成键盘动作_java实现鼠标和键盘动作后台监听

    有的时候需要我们对鼠标和键盘的动作(鼠标的移动,键盘的点击)进行监听,比如按键记录,鼠标坐标记录等. 我们使用JNA来实现以上的操作 tips:JNA类库使用一个很小的本地类库sub 动态的调用本地代 ...

  3. java用jintellitype和jna两种方式实现鼠标键盘后台监听

    下载相关dll文件 我的目录结构                              依赖jintellitype-1.3.9.jar方式实现 需要一个jar文件和两个c编写dll文件,注意:d ...

  4. android如何使用BroadcastReceiver后台实现来电通话记录的监听并存取到sqllite数据库通过Contentprovilder实现接口...

    BroadcastReceiver 是android四大组件的一个,本质上是一种全局的监听器,用于监听全局的广播消息.下面实现了后台监听android手机通话记录.本demo分两个程序,第一个程序是设 ...

  5. Android 来电监听

    最近刚接到一个需求,为BOSS做一个来电显示功能,查找号码库显示姓名角色. 一.查找来电监听方法 PhoneStateListener监听器类,用于监视设备上特定电话状态的变化,包括服务状态.信号强度 ...

  6. Android怎样监听蓝牙耳机的按键事件

    Android怎样监听蓝牙耳机的按键事件 写在前面: 直接想要代码非常easy,你直接把滚动栏拉到最底端就能够看到.假设想要十分地了解为什么,那就依照我规划的一步一步来理解.下面測试环境以手头上有的「 ...

  7. Android如何监听蓝牙耳机的按键事件(转)

    源: Android如何监听蓝牙耳机的按键事件 写在前面: 直接想要代码很简单,你直接把滚动条拉到最底端就可以看到.如果想要十分地了解为什么,那就按照我规划的一步一步来理解.以下测试环境以手头上有的「 ...

  8. android 监听手机电量变化

    今天,简单讲讲如何监听手机电量的变化. 监听电量是不能静态注册的. 后来上网搜索,发现有五个不能静态注册的广播,这里记录一下,免得下次再后知后觉的发现并惊讶于自己的笨拙. 不能静态注册的广播: and ...

  9. php代码实现tp5监听队列,thinkPHP5的队列使用

    1.下载tp5的完全包,里面含有queue的扩展.如果没有执行如下命令: composer require topthink/think-queue 1.1.4 2.执行第二步: 执行的队列: nam ...

最新文章

  1. 高性能mysql的事物隔离级别
  2. Highmaps网页图表教程之图表配置项结构与商业授权
  3. GridView使用技巧.txt
  4. Python封装发送信息到钉钉群
  5. [C++STL]queue容器用法介绍
  6. c语言入门函数大全,C语言函数大全(适合初学者).doc
  7. 赛门铁克linux安装教程,Symantec赛门铁克14.2版本服务端安装教程及配置教程(三)...
  8. (二)洞悉linux下的Netfilteriptables:内核中的ip_tables小觑
  9. 在CNDS博客中插入Latex公式
  10. 硬原理——DC-DC升压(BOOST)电路原理
  11. 怎么用python画椭圆_python画椭圆
  12. 自学成才秘籍!机器学习深度学习经典资料汇总
  13. 多项式拟合缺点_常见算法优缺点
  14. 《南方周末》今日发文揭开了这场抢票插件阻击战的内幕
  15. “读芯术”精华文章汇总:专业知识
  16. python3APP爬虫--爬取王者荣耀小姐姐cosplay照片(附源码)
  17. 【Fluent】如何快速地设置wall壁面/zones区域的边界条件boundary condition?例如当存在很多wall壁面时,快速批量地修改材料等边界条件
  18. python numpy求四分位距
  19. 永硕e盘php,永硕E盘特效代码集萃
  20. 【Android多媒体(重采样与混频)】从playback流程分析AudioResampler,AudioMixer

热门文章

  1. 数字逻辑电路(前三章简介)
  2. 二叉树的性质及其创建
  3. 学习笔记16 window service 服务的相关内容
  4. 基于深度强化学习的组合优化方法在工业应用中的实践
  5. Pandas中to_excel实现数据追加或者覆盖到Excel工作表
  6. 为什么日本的网页设计风格还停留在90年代?
  7. MATLAB中不用循环生成圆盘(圆形)/圆环掩膜矩阵
  8. 阻塞双端消息队列 BlockingDeque(先进先出的原则管理)
  9. 计算机网络与通信实验报告——HTTP协议分析
  10. api有哪些 javasocket_简单hello/hi程序、分析及Java Socket API与Linux Socket API对比