前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity实战篇 | 使Unity打包的exe程序始终保持屏幕最前端【文末送书】

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

作者头像
呆呆敲代码的小Y
发布2023-04-09 09:12:36
1.7K0
发布2023-04-09 09:12:36
举报
文章被收录于专栏:呆呆敲代码的小Y 公众号

文章目录

代码语言:txt
复制
    - [📢前言](https://cloud.tencent.com/developer)🎬

📢前言

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

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

一、编写核心脚本代码

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

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

辅助脚本:C.cs

代码语言:javascript
复制
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

代码语言:javascript
复制
//公众号:呆呆敲代码的小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文件会一直显示在屏幕最前方不会被其他窗口盖住。


💬总结

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 📢前言
  • 🎬Unity实战篇 |使Unity打包的exe程序始终保持屏幕最前端
    • 一、编写核心脚本代码
      • 二、将应用程序打包成Exe并运行测试
        • 三、效果展示
        • 💬总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档