Unity程序使用Win32api编译后,隐藏到后台运行

5647ac5ae197d721d2049782eed17dee.png

superowner原创,如有雷同,纯属搬运
本文的脚本,可以解决Unity隐藏主窗口后,后台异常高CPU占用

思路就是窗口最小化,然后隐藏任务栏快捷图标,当然进一步可以显示到托盘
网上的教程有的是隐藏Unity主窗口,当然有可能出bug,换个思路不就行了
隐藏其实和最小化差不多,也是一样在后台运行,可能一些api和Unity运行机制冲突
当我这样就不会冲突

部分函数ShowWindow,GetActiveWindow以及参数,可以到MSDN查阅或谷歌
当然,最好不要用百度(程序员不友好),不错,我就是蔑视百度

咱优雅的程序媛就是要用写文章

       void Start()
       {
        WinApi.HideTaskbarIcon(WinApi.GetActiveWindow());
        WinApi.ShowWindow(WinApi.GetActiveWindow(), WinApi.SW_MINIMIZE);
    }
    void OnDisable()
    {
               //test
        #if UNITY_EDITOR
        WinApi.ShowTaskbarIcon(WinApi.GetActiveWindow());
        WinApi.ShowWindow(WinApi.GetActiveWindow(), WinApi.SW_SHOW);
                #endif
    }  

        //--------------------
        //快捷图标隐藏,superowner原创:
    public static readonly long WS_EX_APPWINDOW = 0x00040000L;
    public static readonly long WS_EX_TOOLWINDOW = 0x00000080L;

    public static bool HideTaskbarIcon(IntPtr m_hWnd)
    {
        ShowWindow(m_hWnd, SW_HIDE);
        var lStyle = GetWindowLong(m_hWnd, GWL_EXSTYLE);
        lStyle &= ~WS_EX_APPWINDOW;
        lStyle |= WS_EX_TOOLWINDOW;
        SetWindowLong(m_hWnd, GWL_EXSTYLE, lStyle);
        return ShowWindow(m_hWnd, SW_SHOW);
    }
    public static bool ShowTaskbarIcon(IntPtr m_hWnd)
    {
        ShowWindow(m_hWnd, SW_HIDE);
        var lStyle = GetWindowLong(m_hWnd, GWL_EXSTYLE);
        lStyle &= ~WS_EX_TOOLWINDOW;
        lStyle |= WS_EX_APPWINDOW;
        SetWindowLong(m_hWnd, GWL_EXSTYLE, lStyle);
        return ShowWindow(m_hWnd, SW_SHOW);
    }

然后是外部启动Unity Release后的exe代码
启动参数参照:https://www.jianshu.com/p/1f0683ddfc44,当然你可以不用

  class Program
    {
        static void Main(string[] args)
        {
            Process p = new Process();
            p.StartInfo.FileName = @"C:\UnityProject\CMD\Build\CMD.exe";
            p.StartInfo.Arguments = "妹妹就是爱asd";
            p.StartInfo.UseShellExecute = false;
            //p.StartInfo.RedirectStandardInput = true;
            //p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            //System.Diagnostics.Process.Start(@"C:\UnityProject\CMD\Build\CMD.exe", "妹妹就是爱asd");
        }
    }

你可能感兴趣的:(Unity程序使用Win32api编译后,隐藏到后台运行)