Unity窗口标题栏显示项目路径

2023-11-07

Unity项目开发过程中会有主干分支等等很多版本,同时打开多个项目时无法区分各个Unity窗口是哪个版本,可以把项目完整路径设置到窗口标题栏方便区分,方法如下:

 UpdateUnityEditorProcess.cs

using System;
using System.Runtime.InteropServices;
using System.Text;

public partial class UpdateUnityEditorProcess
{
    public delegate bool EnumThreadWindowsCallback(IntPtr hWnd, IntPtr lParam);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool EnumWindows(EnumThreadWindowsCallback callback, IntPtr extraData);
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int GetWindowThreadProcessId(HandleRef handle, out int processId);

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    public static extern IntPtr GetWindow(HandleRef hWnd, int uCmd);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern bool IsWindowVisible(HandleRef hWnd);

    [DllImport("user32.dll")]
    private static extern bool GetWindowText(int hWnd, StringBuilder title, int maxBufSize);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private extern static int GetWindowTextLength(IntPtr hWnd);

    [DllImport("user32.dll", EntryPoint = "SetWindowText", CharSet = CharSet.Auto)]
    public extern static int SetWindowText(int hwnd, string lpString);
}

 UpdateUnityEditorProcess.Editor.cs

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;
using UnityEngine;

public partial class UpdateUnityEditorProcess
{
    public IntPtr hwnd = IntPtr.Zero;
    private bool haveMainWindow = false;
    private IntPtr mainWindowHandle = IntPtr.Zero;
    private int processId = 0;
    private IntPtr hwCurr = IntPtr.Zero;
    private static StringBuilder sbtitle = new StringBuilder(255);
    private static string UTitle = Application.dataPath;
    public static float lasttime = 0;

    private static UpdateUnityEditorProcess _instance;
    public static UpdateUnityEditorProcess Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new UpdateUnityEditorProcess();
                _instance.hwnd = _instance.GetMainWindowHandle(Process.GetCurrentProcess().Id);
            }
            return _instance;
        }
    }

    public void SetTitle()
    {
        //UnityEngine.Debug.Log(string.Format("{0} - {1}", Time.realtimeSinceStartup, lasttime));
        if (Time.realtimeSinceStartup > lasttime)
        {
            sbtitle.Length = 0;
            lasttime = Time.realtimeSinceStartup + 2f;
            int length = GetWindowTextLength(hwnd);

            GetWindowText(hwnd.ToInt32(), sbtitle, 255);
            string strTitle = sbtitle.ToString();
            string[] ss = strTitle.Split('-');
            if (ss.Length > 0 && !strTitle.Contains(UTitle))
            {
                SetWindowText(hwnd.ToInt32(), string.Format("{0} - {1}", UTitle, strTitle));
                UnityEngine.Debug.Log("Current Unity Title: " + UTitle);
            }
        }
    }

    public IntPtr GetMainWindowHandle(int processId)
    {
        if (!this.haveMainWindow)
        {
            this.mainWindowHandle = IntPtr.Zero;
            this.processId = processId;
            EnumThreadWindowsCallback callback = new EnumThreadWindowsCallback(this.EnumWindowsCallback);
            EnumWindows(callback, IntPtr.Zero);
            GC.KeepAlive(callback);

            this.haveMainWindow = true;
        }
        return this.mainWindowHandle;
    }

    private bool EnumWindowsCallback(IntPtr handle, IntPtr extraParameter)
    {
        int num;
        GetWindowThreadProcessId(new HandleRef(this, handle), out num);
        if ((num == this.processId) && this.IsMainWindow(handle))
        {
            this.mainWindowHandle = handle;
            return false;
        }
        return true;
    }

    private bool IsMainWindow(IntPtr handle)
    {
        return (!(GetWindow(new HandleRef(this, handle), 4) != IntPtr.Zero) && IsWindowVisible(new HandleRef(this, handle)));
    }
}

UpdateUnityEditorTitle.cs

#if UNITY_EDITOR_WIN
using UnityEditor;

[InitializeOnLoad]
class UpdateUnityEditorTitle
{
    private static bool isInGame = false;
    static UpdateUnityEditorTitle()
    {
        EditorApplication.delayCall += DoUpdateTitleFunc;

        EditorApplication.playmodeStateChanged += OnPlaymodeStateChanged;
    }

    static void OnPlaymodeStateChanged()
    {
        if (EditorApplication.isPlaying == isInGame) return;
        isInGame = EditorApplication.isPlaying;
        UpdateUnityEditorProcess.lasttime = 0;
        DoUpdateTitleFunc();
    }

    static void DoUpdateTitleFunc()
    {
        //UnityEngine.Debug.Log("DoUpdateTitleFunc");
        UpdateUnityEditorProcess.Instance.SetTitle();
    }
}
#endif

效果如下:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity窗口标题栏显示项目路径 的相关文章

  • Unity 分块延迟渲染01 (TBDR)

    现代移动端图形体系结构的概述 现代SoC通常会同时集成CPU和GPU CPU被用于处理需要低内存延迟的序列 大量分支的数据集 其晶体管用于流控制和数据缓存 GPU为处理大型 未分支的数据集 如3D渲染 晶体管专用于寄存器和算术逻辑单元 而不
  • Unity中级客户端开发工程师的进阶之路

    上期UWA技能成长系统之 Unity高级客户端开发工程师的进阶之路 得到了很多Unity开发者的肯定 通过系统的学习 可以掌握游戏性能瓶颈定位的方法和常见的CPU GPU 内存相关的性能优化方法 UWA技能成长系统是UWA根据学员的职业发展
  • Unity-AR 简介

    Unity AR 简介 现有Unity AR Sdk ARKit 苹果推出的AR开发平台 ARCore Google 推出的增强现实 SDK ARFoundation ARFoundation是ARKit XR插件和ARCore XR插件
  • Unity Shader入门精要第七章 基础纹理之遮罩纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一 实践 参考 前言 遮罩纹理 mask texture 是本章要介绍的最后一种纹理 它非常有用 在很多商业游戏中 都可以见到它的身影 那么什么是遮罩呢 简单来讲 遮罩允许我们
  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render
  • Unity学习笔记(一)—— 基础知识

    一 基础知识 1 开发团队组成 2 unity特点 图形界面 所见即所得 入门简单 支持C 比OC C 更友好 js 国内外资源丰富 因为使用的人多 跨平台性好 PC端 移动端等 对VR AR的支持最完善 3 成功案例 游戏 炉石传说 神庙
  • 【IMGUI】 各种辅助类 EditorGUIUtility、EditorUtility、GUIUtility、GUILayoutUtility

    EditorGUIUtility class in Editor 继承自 GUIUtility EditorGUI 的各种辅助程序 EditorGUIUtility currentViewWidth 我尝试打印了下这个值和position
  • unity: C#的Action Event Delegate的异同

    目录 一 Action 二 Event 三 Action和Event区别 四 Delegate 总结 Action Event Delegate的异同 前言 Action Event和Delegate都是C 语言中的重要概念 分别用于管理函
  • Unity保存图片到相册

    Unity保存图片到Android相册 Java 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  • Unity万向节死锁解决方案(2023/12/4)

    1 万向节死锁无法解决 这是因为它的特性就是如此 就像玻璃杯就是玻璃 这不可否认 别钻牛角尖昂 2 大多数情况下欧拉角足够用 例如 CF 摄像机不可能绕z轴旋转 x轴旋转也不会超过九十度 因为那样人物的腰子会被扭断 塔防游戏 保卫萝卜 吃鸡
  • unity小球跟随音乐节奏放大缩小和改变颜色

    放在小球身上 设置对应组件即可 using System Collections using System Collections Generic using Unity VisualScripting using UnityEngine
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • VS2022 | 显示Unreal Engine日志

    VS2022 显示Unreal Engine日志 视图 gt 其他窗口 gt Unreal Engine日志 视图 gt 其他窗口 gt Unreal Engine日志
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste

随机推荐

  • js MediaSource h264

    https stackoverflow com questions 24102075 mediasource error this sourcebuffer has been removed from the parent media so
  • Topaz DeNoise AI for Mac(AI智能图像降噪工具)

    Topaz DeNoise AI for Mac是最好用的AI智能图像降噪工具 DeNoise AI通过消除噪点的同时恢复原始图像细节 帮助您获得100 的最佳质量 Topaz DeNoise AI for Mac AI智能图像降噪工具
  • Python xml 读取之 ET.parse

    Python xml 读取之 ET parse 前一篇写到了xml 读取方法 一 dom minidom 本次再介绍一种方法 ET parse 常用操作 tree ET parse xml path root tree getroot 获取
  • 刷脸支付赋予日常场景更多的功能和应用

    刷脸支付推出将近一年 已广泛应用于餐饮零售等商业场景 据预测 2019年POS机总保有量约为5000万台 这也意味着刷脸支付至少有500亿的市场空间 不少连锁餐饮品牌相继引入刷脸支付收银机 除了可以提升收银效率 还可以通过打通线上线下 平台
  • 【数据集】目标检测常用数据集

    一个性能优良 极度完美的数据集 具有较小偏差的大数据集 对于计算机视觉领域算法的研究是很重要的 具体非常重要的作用 在目标检测中 知名的数据集一个接着一个的被发布 被公开 被广大研究者使用 本文是总结目标检测领域的权威数据集 既总结也供有需
  • location protocol 属性(http、https)

    location protocol 属性 protocol 属性是一个可读可写的字符串 可设置或返回当前 URL 的协议 语法 location protocol location protocol http 使用场景 vue配置api地址
  • 部署CDN的网站如何找真实IP

    部署CDN的网站找真实IP 1 概述 目前很多网站使用了cdn服务 用了此服务 可以隐藏服务器的真实IP 加速网站静态文件的访问 而且你请求网站服务时 cdn服务会根据你所在的地区 选择合适的线路给予你访问 由此达网站加速的效果 cdn不仅
  • Java面向对象编程

    如下SQL语句中 可能返回null值 1 select count from t1 2 select max col1 from t1 3 select concat max max col1 from t1 A 1 可能 2 和 3 不可
  • 费杰:产品经理修炼之道

    前言 写在 产品经理修炼之道 之前 由于市场对产品经理的需求量增加 加之媒体把产品经理的重要性放大 于是导致大量人员涌进产品经理队伍 但是由于行业本身还不是很成熟 各个企业对产品经理的认识不够深入 大量产品经理处于尴尬的境地 产品经理岗位对
  • StringUtils的方法详解

    StringUtils方法详解 前言 方法详解 字符串为null或空的判断 空字符串的判断 trim相关方法 去除字符串两端指定的字符串 前言 StringUtils是一个处理字符串非常强大的类 能够让我们在处理字符串时少写很多代码 方法详
  • 解决excel导入异常:org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be

    记录一下开发中使用POI中的HSSFWorkbook来读取Excel数据时 遇到的 excel 导入出现的异常问题 先上部分解析代码 获取excel文件流 POIFSFileSystem fileSystem new POIFSFileSy
  • 解决Ubuntu中you are in emergency mode(紧急模式)问题

    我安装的ubuntu18 04 win10的双系统 不知道为什么我的ubuntu开机出现you are in emergency mode 有人说是未正常关键导致 但是我关机都是shutdown 我们现在来解决you are in emer
  • 【CSS】CSS 选择器

    CSS 选择器 1 基础选择器 1 1 元素选择器 语法 标签名 元素选择器会选中对应标签名的HTML元素 例如 p div span 等 1 2 类选择器 语法 类名 类选择器会选中class属性为指定类名的HTML元素 例如 div c
  • 29岁,转行python,一举拿下14k的offer,高薪方法太绝了

    前言 我转行之前从事的工作是商场管理 努力了4年左右的时间才做到楼层经理 但是工资太低并且事情太多 薪资才6K 我的工作需要东奔西跑 每次前往下一个工作地点的时候 我就在想我真的喜欢这种生活吗 偶然有一天 在微信平台上看到的一则Python
  • 美通企业日报

    今日要闻 2019中国最佳表现城市排行榜发布 世界著名智库米尔
  • 【C语言程序设计】学生信息管理系统

    目录 一 实验任务 二 实验代码 三 运行效果 一 实验任务 学生信息管理系统设计 学生信息包括 学号 姓名 年龄 性别 出生年月 地址 电话 E mail等 试设计一学生信息管理系统 使之能提供以下功能 1 系统以菜单方式工作 2 学生信
  • Python 1——温度转换代码分析

    Python 1 主要参考中国大学MOOC 北京理工大学课程 TempConvert2 py 注释 TempStr input 请输入带有符号的温度值 if TempStr 1 in F f C eval TempStr 0 1 32 1
  • c语言程序设计薪水,C语言程序设计  输入10名职工的职工号和工资,计算平均工资并输出低于平均工资的职工号和工资。...

    满意答案 偶要蟹黄堡 2013 11 24 采纳率 40 等级 12 已帮助 6292人 我给你编写了一个简单的 你自己参考一下 自己润色吧 include typedef struct employee char employee num
  • GNSS系列(1)------GNSS坐标系转换

    由于工作需要 最近开启了GNSS系列文章的撰写工作 发布于公司官网 现将其同步至CSDN 原文链接 http onemo10086 com school article 165 GNSS定位不准确 漂移了好几公里 是怎么回事呢 相信有不少用
  • Unity窗口标题栏显示项目路径

    Unity项目开发过程中会有主干分支等等很多版本 同时打开多个项目时无法区分各个Unity窗口是哪个版本 可以把项目完整路径设置到窗口标题栏方便区分 方法如下 UpdateUnityEditorProcess cs using System