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

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

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

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

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

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

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

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

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

文章目录

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

📢前言

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

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

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属性详解【重要】

Unity实战篇 | 使Unity打包的exe程序始终保持屏幕最前端【文末送书】
此时我们点击Build,然后用电脑运行该应用程序即可。


三、效果展示

在打包出来的文件夹中点击exe文件即可运行。
Unity实战篇 | 使Unity打包的exe程序始终保持屏幕最前端【文末送书】

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

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


💬总结

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

👑评论区抽奖送书

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

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

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

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

🎁规则

规则如下:

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

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

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

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

🚀 规则如上🚀

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

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

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

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

没抽到的小伙伴也可以官方平台自行购买哦:
当当自营购买链接: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读书日北大社促销活动

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

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。