Unity实战篇 | 使Unity打包的exe程序始终保持屏幕最前端【文末送书】

news/2024/5/9 6:39:38/文章来源:https://blog.csdn.net/zhangay1998/article/details/129754851

请添加图片描述

  • 🎬 博客主页:https://xiaoy.blog.csdn.net

  • 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉

  • 🎄 学习专栏推荐:Unity系统学习专栏

  • 🌲 游戏制作专栏推荐:游戏制作

  • 🌲Unity实战100例专栏推荐:Unity 实战100例 教程

  • 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

  • 📆 未来很长,值得我们全力奔赴更美好的生活✨

  • ------------------❤️分割线❤️-------------------------

文章目录

      • 📢前言
  • 🎬Unity实战篇 |使Unity打包的exe程序始终保持屏幕最前端
    • 一、编写核心脚本代码
    • 二、将应用程序打包成Exe并运行测试
    • 三、效果展示
  • 💬总结
      • 👑评论区抽奖送书
        • 🎁规则
      • 🎄推荐理由(⭐⭐⭐⭐⭐)


📢前言

  • 大家在平时使用一些软件APP的时候,会看到有些软件打开后有个选项可以将该窗口置顶
  • 置顶之后这个窗口就会显示在屏幕最前方,不会被其他应用窗口遮挡。
  • 想要实现这个功能的话在Unity中并没有找到相关的API可以直接拿来使用。
  • 所以在查阅一番资料之后,最终选择使用Windows句柄调用相关文档API来实现。
  • 下面就来看看怎样操作吧,可以将文中关键脚本挂载到相关场景中就可以使用该功能。

🎬Unity实战篇 |使Unity打包的exe程序始终保持屏幕最前端

请添加图片描述

一、编写核心脚本代码

实现该功能主要是使用了几个关键的Windows的API,分别是下面几个函数:

  • ShowWindow 函数
  • SetWindowPos函数
  • SetForegroundWindow函数

其中关键函数的意义和关键参数,可以到指定链接查看详细信息,这里就不多做阐述了。

辅助脚本:C.cs

using System;  
using System.Diagnostics;  
using System.Runtime.InteropServices;  public class C
{  public delegate bool WNDENUMPROC(IntPtr hwnd, uint lParam);  [DllImport("user32.dll", SetLastError = true)]  public static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, uint lParam);  [DllImport("user32.dll", SetLastError = true)]  public static extern IntPtr GetParent(IntPtr hWnd);  [DllImport("user32.dll")]  public static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref uint lpdwProcessId);  [DllImport("kernel32.dll")]  public static extern void SetLastError(uint dwErrCode);  public static IntPtr GetProcessWnd(){  IntPtr ptrWnd = IntPtr.Zero;  uint pid = (uint)Process.GetCurrentProcess().Id;  // 当前进程 ID  bool bResult = EnumWindows(new WNDENUMPROC(delegate (IntPtr hwnd, uint lParam){  uint id = 0;  if (GetParent(hwnd) == IntPtr.Zero)  {  GetWindowThreadProcessId(hwnd, ref id);  if (id == lParam)    // 找到进程对应的主窗口句柄  {  ptrWnd = hwnd;   // 把句柄缓存起来  SetLastError(0);    // 设置无错误  return false;   // 返回 false 以终止枚举窗口  }  }  return true;  }), pid);  return (!bResult && Marshal.GetLastWin32Error() == 0) ? ptrWnd : IntPtr.Zero;  }  
}  

核心脚本如下:WindowActive.cs

//公众号:呆呆敲代码的小Y
using UnityEngine;
using System.Runtime.InteropServices;
using System;public class WindowActive : MonoBehaviour
{[DllImport("User32.dll")]extern static bool SetForegroundWindow(IntPtr hWnd);[DllImport("User32.dll")]extern static bool ShowWindow(IntPtr hWnd, short State);[DllImport("user32.dll ")]public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);const UInt32 SWP_NOSIZE = 0x0001;const UInt32 SWP_NOMOVE = 0x0002;IntPtr hWnd;//public float Wait = 0;//延迟执行//public float Rate = 1;//更新频率public bool KeepForeground = true;//保持最前void Start(){hWnd = C.GetProcessWnd();Active();//InvokeRepeating("Active", Wait, Rate);}/// <summary>/// 激活窗口/// </summary>void Active(){if (KeepForeground){ShowWindow(hWnd, 1);SetForegroundWindow(hWnd);SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); }}
}

把这个脚本直接挂到摄像机就OK了,发布之后可以看效果,编辑模式下看不到效果。


二、将应用程序打包成Exe并运行测试

我这里是用了一个西红柿闹钟的项目用作测试,因为之前使用该闹钟想提高自己的工作效率时发现该闹钟老是容易被其他应用程序遮挡住,所以才想到让他持续运行在屏幕最前端不被盖住,从而督促自己。

打包的时候需要注意一下Build的配置,改成Windowed模式,启用Run In background,开启Resizable Window。

此处的配置是可以让我们打包出来的应用程序可以自由调节窗口大小,且可以后台持续运行。

具体打包的配置功能可以在此文章中查阅:
Unity打包必备知识 | Player Setting 面板的 Player属性详解【重要】

在这里插入图片描述
此时我们点击Build,然后用电脑运行该应用程序即可。


三、效果展示

在打包出来的文件夹中点击exe文件即可运行。
在这里插入图片描述

运行效果如下:
该西红柿闹钟的exe文件会一直显示在屏幕最前方不会被其他窗口盖住。

请添加图片描述
请添加图片描述


💬总结

  • 本文简单介绍了在Unity中使Unity打包的exe程序始终保持屏幕最前端的方法。
  • 主要是引用了Windows的编程库来完成的功能,如果你有更好的方法也欢迎指出学习哦!
  • 之前还写过一篇文章也是用来调节窗口配置,同样使用了Windows句柄方法。
  • Unity实战篇 |Unity 打包exe 实现隐藏窗口标题栏、隐藏最小化最大化关闭按钮
  • 解决:“Unity打包非全屏游戏,运行时仍然全屏” 的问题

👑评论区抽奖送书

最后在评论区进行抽取三名幸运的小伙伴送下面这本书籍

在这里搞个小活动抽奖送给大家,对看书感兴趣的小伙伴可以参加一波呀,抽中概率很大哦!

《剪辑师手册:视频剪辑与创作从入门到精通(剪映版)》

视频剪辑对大多数人来说都可以作为一个爱好和副业去研究,所以本次给大家带来的是一本视频剪辑的书。
对于想学习视频剪辑的小伙伴,这本书就可以让你了解相关知识,对症下药可以极大地提高学习效率!

🎁规则

规则如下:

🚀 规则如下🚀
  • 给本篇博客文章 点赞 收藏 评论 三连,然后就可以在博客文章评论区抽奖送一本剪辑师手册的书籍!

  • 总共抽三本,中的几率还是很大的哦~ 想看书的小伙伴参与起来!

  • 中奖信息文章发布时间的三天后下午本篇文章评论区公布!记得留意呀!

  • 没抽到的,但是喜欢这本书的小伙伴也可以在网上自行购买哈,官方正品商店购买即可!

🚀 规则如上🚀

🎄推荐理由(⭐⭐⭐⭐⭐)

  • 高品质的视频越来越受欢迎,作为想要入职视频创作、剪辑与制作行业的人,需要不断提升自身的能力,才能不断收集到好的素材,有新颖的创意,有娴熟的剪辑技巧,有不断满足观看者的特效,

  • 1本书精通剪映手机版+电脑版:60多个抖音爆款案例剖析+115集同步教学视频+330个练习素材文件+精美的PPT课件,28万粉丝都喜欢的剪辑与创作技巧,让你快速成长为行业大咖!

在这里插入图片描述

没抽到的小伙伴也可以官方平台自行购买哦:
当当自营购买链接:http://product.dangdang.com/29490878.html

最后再提一下,世界读书日 马上就来啦,北大出版社也有对应的活动,所以大家喜欢看书的一定要把握住这次机会嗷,下次还早着,千万不要错过啦!

北京大学出版社,4月“423世界读书日”促销活动安排来啦
当当活动日期:4.6-4.11,4.18-4.23
京东活动日期: 4.6 一天, 4.17-4.23
活动期间满100减50或者半价5折销售
希望大家关注参与423读书日北大社促销活动

如果实在喜欢但是没抽到你的话,可以在评论区说一下,后续可以再给大家继续送福利!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_283695.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Winform控件开发(28)——ToolTip(史上最全)

前言: 该控件的作用是在鼠标移动到控件上方时,弹出一个提示框,效果如下: 利用方法SetToolTip将工具提示和控件绑定 toolTip1.SetToolTip(button1 ,"提示1");一、属性 1、Name 获取控件对象 2、Active 为true时,工具提示才有效 3、AutomaticDelay 设置该…

第一章:part1监督学习:回归

线性回归&#xff08;linear regression model&#xff09; 线性回归模型 回归&#xff1a;可以预测数字作为输出 是一种特殊的监督学习模型 例&#xff1a;通过已知的房价来拟合曲线 可以求得英尺的价格 区别回归与分类&#xff1a;分类的输出结果一般为离散的&#xff0c;并…

Python第二章---列表简介

1、列表是什么&#xff1f; 在Python中用 [ ] 表示列表&#xff0c;用 逗号 , 分隔元素 每个元素用对应类型的方法标注&#xff0c;如字符串类型用单引号‘ ’标注 形如 list1 [a,b,c] print(list1); 输出时&#xff0c;会打印全部内容&#xff0c;包括符号 访问列表元…

Linux系统操作命令

1.linux目录结构 不同于 Windows 系统的⽂件路径的起点是盘符, Linux 系统的路径起点是/(根⽬录) 注意: - 1. / 为根⽬录, 是所有⽂件的路径的起点 - 2. 根⽬录下的所有第⼀层级的⽂件夹, 均不能随意进⾏修改操作 - 3. 掌握常⽤⽬录的作⽤即可 - 4. / 根⽬录, /home 普通⽤户…

AI助手帮你轻松做好Imagenet数据集重命名与复制

AI助手帮你轻松做好Imagenet数据集重命名与复制 任务需求 我们对Imagenet数据集进行了水下的退化处理&#xff0c;保存的数据集所有图片的深度图&#xff0c;格式为.npy。但是命名存在一些问题&#xff0c;现有格式为&#xff1a;n02009912_1916.JPEG.npy&#xff0c;需要更改…

哪个网站的电子书最多?

程序员宝藏库&#xff1a;https://gitee.com/sharetech_lee/CS-Books-Store 随便找一个电子书导航&#xff0c;就会给你提供几十个电子书下载网站。 然而&#xff0c;当真正用到时会发现&#xff0c;质量层次不齐&#xff0c;在绝大多数时候试遍几十个网站都找不到自己想要的书…

【蓝桥杯算法模板题--蓝桥题库Java】

PDF下载地址&#xff1a;点击即可 文章目录算法模板1 排序&#xff08;ArrayList&#xff0c;sort&#xff09;题目描述输入描述输出描述输入输出样例示例 1运行限制2 小明的彩灯&#xff08;差分&#xff09;输入输出样例示例 1运行限制3 绝世武功&#xff08;二阶差分算法&am…

「STM32入门」TIM输出比较

输出比较的简介 输出比较英文写作OC (Output Compare) 输出比较可以通过比较CNT和CCR寄存器值的关系&#xff0c;来对输出电平进行置高或者置低或者翻转的操作&#xff0c;用于输出一定频率和占空比的PWM波形常见应用例子如&#xff1a;呼吸灯&#xff0c;调速电机等CCR&#x…

2023年第十四届蓝桥杯javaB组省赛真题

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;练习时长两年半的java博主 &#x1f4d6;个人主页&#xff1a;君临๑ &#x1f39e;️文章介绍&#xff1a;2023年第十四届蓝桥杯javaB组省赛真题 &#x1f389;所属专栏&#xff1a;算法专栏 &#x1f381; ps&#xff1a;点…

计算机网络复习——第二章 2.3

2.3物理层下面的传输媒体 传输媒体是数据传输系统中在发送器和接收器之间的物理通路。 两大类&#xff1a; 导引型传输媒体&#xff1a;电磁波被导引沿着固体媒体&#xff08;铜线或光纤&#xff09;传播。 非导引型传输媒体&#xff1a;指自由空间。非导引型传输媒体中电磁…

IDEA修改关键字和注释颜色

IDEA修改关键字和注释颜色 目录IDEA修改关键字和注释颜色1.修改关键字的默认颜色2.修改注释的默认颜色2.1 修改单行注释的颜色2.2 修改多行注释的颜色2.3 修改文档注释的颜色很多小白在刚刚使用IDEA的时候还不是很熟练 本文主要给大家提供一些使用的小技巧&#xff0c;希望能帮…

推荐系统:基础知识总结

itemCF的召回实践及其在信息流推荐中的应用1.1 推荐系统中的召回基本范式&#xff1f;1.2 为何要进行召回&#xff1f;1.3 召回传统方式有哪些&#xff1f;2. itemCF类召回2.1 从哪几个方向理解item CF2.2 通用建模方式还有哪些&#xff1f;3.ItemCF实践3.1 在信息流中如何抽取…

QT学习笔记(语音识别项目 )

语音识别项目 我们知道 AI 智能音箱已经在我们生活中不少见&#xff0c;也许我们都玩过&#xff0c;智能化非常高&#xff0c;功能 强大&#xff0c;与我们平常玩的那种蓝牙音箱&#xff0c;Wifi 音箱有很大的区别&#xff0c;AI 智能在哪里呢&#xff1f;语音识别技 术和云端…

AR实战-基于Krpano的多场景融合及热点自定义

背景 在之前的博客中&#xff0c;曾经介绍了关于Krpano的相关知识&#xff0c;原文&#xff1a;全景自动切片技术-krpano初识。简单讲解了基于krpano1.19-pr13下单张全景照片的处理与展示。随着实景中国在各地的落地生根&#xff0c;三维园区、三维景区、三维乡村等等需求的集中…

【中土世界】贝烈瑞安德简介

一、Map of Beleriand and the Land to the North 该地图为托尔金之子&#xff0c;克里斯托弗托尔金所手绘&#xff0c;描绘了第二纪元&#xff0c;中洲西北的贝烈瑞安德&#xff08;Beleriand&#xff09;的景象。从下图可以直观地看出&#xff0c;贝烈瑞安德在中洲的相对位置…

【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式省赛[第一场]程序设计题以及详细题解

文章目录原题展示原题分析原题题解LED相关LCD相关按键相关ADC相关定时器相关PWM输入捕获小结文章福利原题展示 原题分析 今年的第一场比赛绝对np,官方将串口直接省掉了&#xff0c;将其替换成很多小功能&#xff0c;如&#xff1a;切换计时、频率均匀变化、锁机制等等&#xff…

【数据结构】--并查集

目录 一、概念 ​编辑 二、应用场景--“连接”问题&#xff08;属于同一Qu 三、实现思路 四、如何存储数据 五、定义接口 1.初始化&#xff08;init&#xff09; 2.其他 isSame&#xff08;&#xff09; 六、抽象类 六、Quick Find【v1 所在集合的所有元素都指向 v2 的…

45-Dockerfile-ARG/ENV指令

AGR/ENV指令前言ARG作用格式说明生效范围使用示例ENV作用格式说明使用环境变量使用示例ARG 和 ENV 的区别前言 本篇来学习下Dockerfile中的AGR/ENV指令 ARG 作用 定义一个可以在构建镜像时使用的变量 格式 ARG <name>[<default value>]说明 在执行 docker b…

SpringBoot学习笔记(四)

SpringBoot整合quartz 任务 定时任务是企业级应用中的常见操作市面上流行的定时任务技术: Quartz、 Spring Task 相关概念: 工作(Job):用于定义具体执行的工作工作明细(JobDetail):用于描述定时工作相关的信息触发器(Trigger):用于描述触发工作的规则,通常使用cron表达式定…

Unity --- 3d数学 --- 坐标系统

1.世界坐标系是固定不动的 2.每一个游戏物体在世界坐标系中都有对应的坐标和方向 1.轴心点的位置不是固定的&#xff0c;是可以人为设定的 1.Screen Space --- 屏幕坐标 2.我们看到的屏幕其实就是相机所在的平面的位置 --- 而屏幕坐标系的Z其实就是游戏中的物体到相机平面的…