[Unity] 在软件标题栏显示工作路径
(一)问题
项目开发中常会有开多个分支,同时启动多个 Unity 程序的情况,来回切换的时候就容易混淆,有时候还需要用 Show In Explorer 或者其他标志来确认当前使用的是哪个分支。
于是想在标题栏上直接显示出当前的工作目录:
修改前:

原本的标题栏由项目名、场景、工作平台等文本组成
修改后:

额外显示工作路径
(二)代码
1. 声明要调用的系统接口
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);
}
2. 工具类
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)));
}
}
3. Editor 回调设置
#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
(三)备注
[InitializeOnLoad]的调用时机是在 Unity 初始化标题之前,所以直接在UpdateUnityEditorTitle()中设置标题的话会被覆盖掉,这里利用EditorApplication.delayCall 调用标题修改- 进入退出 GameMode 会触发 Unity 软件初始化标题,利用
EditorApplication.playmodeStateChanged来调用自定义的标题修改
[Unity] 在软件标题栏显示工作路径的更多相关文章
- Linux显示工作路径
Linux显示工作路径 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ pwd /home/youhaidong
- linux服务器上如何显示工作路径
1. 修改PS环境变量 [root@linux-node01 ~]# vi /etc/bashrc [ "$PS1" = "\\s-\\v\\\$ " ] &a ...
- pwd 显示当前所在的工作路径
1.功能说明 pwd命令是“print working directory ”首字母缩写,显示当前目录的绝对路径. 2.语法格式 pwd [option] pwd 选项 3.命令参数 参数 参数说明 ...
- C#、ASP.NET获取当前应用程序的绝对路径,获取程序工作路径 (转帖)
C#.ASP.NET获取当前应用程序的绝对路径,获取程序工作路径 ============================================ 使用 Application.Start ...
- 关于source insight、添加.s和.S文件,显示全部路径、加入项目后闪屏幕
1.source insight使用也有一年多时间了,今天出现建工程后添加文件“no files found” 百思不得姐: 后面发现是原工程命名时出现非法字符.重新命名就ok了. 切记切记 2.实用 ...
- Jupyter Notebook默认工作路径的修改
相信每一个学习Python的童鞋,都尝试过Jupyter Notebook,所以我也就不多介绍,真的还不错哎这软件. 不过美中不足的,就是它的默认工作路径,每次打开都是系统盘的Administrato ...
- 【原创】os.chdir设置的工作路径和sys.path之间到底是个啥关系?
转载请注明出处:https://www.cnblogs.com/oceanicstar/p/9390455.html 直接放上测试后的结论(测试代码和截图过多,有兴趣的小伙伴可自己测试,未来看情况 ...
- Ubuntu 14 下,命令行终端显示短路径
Ubuntu的终端命令行默认是长路径,即把路径深度全部显示出来,操作起来不是很方便,下面介绍命令行显示短路径的操作: $ vi ~/.bashrc 找到PS1= 的行,将\w(小写)改成\W(大写 ...
- BAT: Windows批处理更改当前工作路径
最近项目上需要获取文件夹下所有文件信息,因为文件夹是在server上,所以想用批处理bat来获取该路径下所有文件信息,然后通过任务计划管理去每天自动运行bat去更新文件信息内容. 获取文件夹下所有文件 ...
随机推荐
- 一次神奇的Azure speech to text rest api之旅
错误Max retries exceeded with url: requests.exceptions.ConnectionError: HTTPSConnectionPool(host='%20e ...
- node.js和vue cli脚手架下载安装配置方法
一.node.js安装以及环境配置 1.下载vue.js 下载地址: https://nodejs.org/en/ 2.安装node.js 下载完成后,双击安装包开始安装.安装地址最好换成自己指定的地 ...
- Linux创建运行C/C++代码
不同于在Windows操作系统下借助IDE运行C++程序,Linux操作系统可以使用g++编译 创建文件及编译文件的流程 1. 先进入某一文件目录下,创建一个文件(也可以用mkdir创建文件) to ...
- yum源 epel源 no package available 更换国内yum源
有时候安装软件会出现 no package available 解决办法:yum install epel-release 安装完会在/etc/yum.repos.d/目录下下生成两个repo文件: ...
- 有关softmax函数代码实现的思考
有关softmax函数代码实现的思考 softmax函数 def softmax2(x): if x.ndim == 2: x = x.T x = x - np.max(x, axis=0) y = ...
- 利用 Python 进行数据分析(Python 数据分析)· 第 2 版
译者:SeanCheney 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. ApacheCN 机器学习交流群 629470233 ApacheCN 学习资源 Sklearn 与 ...
- 对线面试官,凭借nginx能一战封神吗?
面试官:小伙子,你对nginx熟悉吗? 我:当然熟悉了,请听我慢慢道来. 心里想,我能吊打面试官吗?今天非得灭一灭面试官的威风,平时都被怼的狗血淋头. 面试官:就你那点花花肠子,咱还不清楚. 我:.. ...
- 《手把手教你》系列技巧篇(六十四)-java+ selenium自动化测试 - cookie -中篇(详细教程)
1.简介 今天按照原计划宏哥要用实例来给小伙伴或童鞋们来演示一下,如何利用cookie实现跳过验证码进行登录.这个场景是自动登陆.有很多系统的登陆信息都是保存在cookie里的,因此只要往cookie ...
- Java--面向对象设计
[转载自本科老师上课课件] 问题一: 在一个软件的功能模块中,需要一种图像处理的功能.该图像处理的策略(如何处理)与图像的内容是相关的.如:卫星的运行图片,使用策略A处理方式,如果是卫星内云图片,则需 ...
- GitHub page创建
这是我的博客,才刚刚建成请多多指教 https://henryztong.github.io/ 以下地址都是关于创建GitHub 博客的: 地址 说明 https://pages.github.c ...