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

最近有个需求,记录在窗口切到后台和切回前台时的时间。找了很久,没有具体的方法,光看到有个委托事件也不知道怎么用。查资料+测试了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. 2021年大数据常用语言Scala(十二):基础语法学习 方法调用方式
  2. JVM:垃圾回收相关算法
  3. hadoop优化之操作系统优化
  4. shell脚本之日志拆分和监听
  5. Crawler:爬虫之基于https+parse库实现爬取国内某知名招聘网上海、北京关于区块链职位的求职信息
  6. mac下安装redis
  7. Matlab中plot函数绘图基本用法
  8. 服务器部署 配置jetty运行参数_Zookeeper+websocket实现对分布式服务器的实时监控...
  9. RNN知识+LSTM知识+encoder-decoder+ctc+基于pytorch的crnn网络结构
  10. perl 面向对象demo
  11. node html5,html5前端入门教程分享:Node.Js 框架
  12. 前端element-ui中图片oss直传到阿里云
  13. 利用Catmull-Rom算法画人脸轮廓
  14. 线下活动受阻?打造线上会议方案势在必行
  15. UI设计的APP标准规范
  16. HR人力资源部门在招聘、入职、参与和培训方面的 OKRs 案例集
  17. 计算机中的电子科学与技术论文,电子科学与技术优秀毕业论文.doc
  18. 推荐五个常用的免费图片素材下载网站
  19. 无基础学Linux(4)——基本系统
  20. JAVA的人民币大写(金额)转化

热门文章

  1. git-cola安装与使用
  2. landsat8与sentinel2波段对比
  3. vue使用ajax提交数据,vue中使用ajax请求 data的数据问题
  4. c语言实现登录注册功能
  5. PicoZense TOF 深度摄像头技术参数 | AIRCamera,DCAM710,DCAM100
  6. python描述性统计离散型变量_数据的描述性统计(Python3 实现)
  7. C# MessageBox弹窗
  8. matlab打印函数disp如何不换行
  9. CTF网络安全大赛介绍
  10. VMware克隆Linux虚拟机