美文网首页unity
Unity程序使用Win32api编译后,隐藏到后台运行

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

作者: superowner | 来源:发表于2019-03-03 11:31 被阅读2次
    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编译后,隐藏到后台运行

        本文链接:https://www.haomeiwen.com/subject/nwdpuqtx.html