什么都不说,上效果:
上代码:
#if UNITY_EDITOR_WIN using UnityEngine; using UnityEditor; using System.Runtime.InteropServices; using System.Diagnostics; using UnityEditor.Callbacks; using System; using System.Text; [InitializeOnLoad] class UpdateUnityEditorTitle { static UpdateUnityEditorTitle() { EditorApplication.hierarchyWindowItemOnGUI += DoUpdateTitleFunc; } static void DoUpdateTitleFunc(int instanceID, Rect selectionRect) { UpdateUnityEditorProcess.Instance.SetTitle(); } } public class UpdateUnityEditorAssetHandler { [OnOpenAssetAttribute(1)] public static bool AssetHandlerStep(int instanceID, int line) { UpdateUnityEditorProcess.lasttime = 0f; return false; // we did not handle the open } } 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; public delegate bool EnumThreadWindowsCallback(IntPtr hWnd, IntPtr lParam); 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 (strTitle.Length > 0 && !ss[0].Contains(UTitle)) { SetWindowText(hwnd.ToInt32(), string.Format("{0} - {1}", UTitle, strTitle)); } } } 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))); } [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); } #endif
时间: 2024-10-14 15:19:14