博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity 设置窗体透明
阅读量:6082 次
发布时间:2019-06-20

本文共 27918 字,大约阅读时间需要 93 分钟。

设置窗口透明、窗口置顶、鼠标穿透

   

方法一、

缺点:边缘不平滑,有毛边

参考博客:

1、https://alastaira.wordpress.com/2015/06/15/creating-windowless-unity-applications/

2、http://www.manew.com/thread-43230-1-1.html

3、https://blog.csdn.net/dark00800/article/details/70314432

关键代码

Shader "Custom/ChromakeyTransparent" {    Properties {        _MainTex ("Base (RGB)", 2D) = "white" {}        _TransparentColourKey ("Transparent Colour Key", Color) = (0,0,0,1)        _TransparencyTolerance ("Transparency Tolerance", Float) = 0.01     }    SubShader {        Pass {            Tags { "RenderType" = "Opaque" }            LOD 200                     CGPROGRAM             #pragma vertex vert            #pragma fragment frag            #include "UnityCG.cginc"             struct a2v            {                float4 pos : POSITION;                float2 uv : TEXCOORD0;            };             struct v2f            {                float4 pos : SV_POSITION;                float2 uv : TEXCOORD0;            };             v2f vert(a2v input)            {                v2f output;                output.pos = mul (UNITY_MATRIX_MVP, input.pos);                output.uv = input.uv;                return output;            }                     sampler2D _MainTex;            float3 _TransparentColourKey;            float _TransparencyTolerance;             float4 frag(v2f input) : SV_Target            {                // What is the colour that *would* be rendered here?                float4 colour = tex2D(_MainTex, input.uv);                             // Calculate the different in each component from the chosen transparency colour                float deltaR = abs(colour.r - _TransparentColourKey.r);                float deltaG = abs(colour.g - _TransparentColourKey.g);                float deltaB = abs(colour.b - _TransparentColourKey.b);                 // If colour is within tolerance, write a transparent pixel                if (deltaR < _TransparencyTolerance && deltaG < _TransparencyTolerance && deltaB < _TransparencyTolerance)                {                    return float4(0.0f, 0.0f, 0.0f, 0.0f);                }                 // Otherwise, return the regular colour                return colour;            }            ENDCG        }    }}
using System;using System.Runtime.InteropServices;using UnityEngine; public class TransparentWindow : MonoBehaviour{    [SerializeField]    private Material m_Material;     private struct MARGINS    {        public int cxLeftWidth;        public int cxRightWidth;        public int cyTopHeight;        public int cyBottomHeight;    }     // Define function signatures to import from Windows APIs     [DllImport("user32.dll")]    private static extern IntPtr GetActiveWindow();     [DllImport("user32.dll")]    private static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);         [DllImport("Dwmapi.dll")]    private static extern uint DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS margins);      // Definitions of window styles    const int GWL_STYLE = -16;    const uint WS_POPUP = 0x80000000;    const uint WS_VISIBLE = 0x10000000;     void Start()    {        #if !UNITY_EDITOR        var margins = new MARGINS() { cxLeftWidth = -1 };         // Get a handle to the window        var hwnd = GetActiveWindow();         // Set properties of the window        // See: https://msdn.microsoft.com/en-us/library/windows/desktop/ms633591%28v=vs.85%29.aspx        SetWindowLong(hwnd, GWL_STYLE, WS_POPUP | WS_VISIBLE);                 // Extend the window into the client area        See: https://msdn.microsoft.com/en-us/library/windows/desktop/aa969512%28v=vs.85%29.aspx         DwmExtendFrameIntoClientArea(hwnd, ref margins);        #endif    }     // Pass the output of the camera to the custom material    // for chroma replacement    void OnRenderImage(RenderTexture from, RenderTexture to)    {        Graphics.Blit(from, to, m_Material);    }}

下面是改进版,添加窗口置顶和鼠标穿透,不过依然存在毛边现象,shader还是用上面的

using System;using System.Runtime.InteropServices;using UnityEngine; public class TransparentWindow :MonoBehaviour{    [SerializeField]    public Material m_Material;    private struct MARGINS    {        public int cxLeftWidth;        public int cxRightWidth;        public int cyTopHeight;        public int cyBottomHeight;    }    // Define function signatures to import from Windows APIs    [DllImport("user32.dll")]    private static extern IntPtr GetActiveWindow();    [DllImport("user32.dll")]    private static extern uint SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);    [DllImport("Dwmapi.dll")]    private static extern uint DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS margins);    [DllImport("user32.dll")]    private static extern uint GetWindowLong(IntPtr hwnd,int nIndex);    [DllImport("user32.dll")]    private static extern int SetLayeredWindowAttributes(IntPtr hwnd,int crKey,int bAlpha,int dwFlags);    ///        /// 窗口置顶    ///        /// 
[DllImport("user32.dll")] private static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int Width, int Height, int flags); /// /// 得到当前活动的窗口 /// ///
[DllImport("user32.dll")] private static extern IntPtr GetForegroundWindow(); const uint LWA_COLORKEY = 0x1; // Definitions of window styles const int GWL_STYLE = -16; const uint WS_POPUP = 0x80000000; const uint WS_VISIBLE = 0x10000000; private const uint WS_EX_LAYERED = 0x80000; private const int WS_EX_TRANSPARENT = 0x20; private const int GWL_EXSTYLE = (-20); private const int LWA_ALPHA = 0x2; IntPtr hwnd; void Start() { Application.runInBackground=true; var margins = new MARGINS() { cxLeftWidth = -1 }; hwnd = GetActiveWindow(); DwmExtendFrameIntoClientArea(hwnd, ref margins); WindowTop(); chuantoulong(); } /// /// 设置窗体置顶 /// private void WindowTop() { SetWindowPos(GetForegroundWindow(), -1, 0, 0, 0, 0, 1 | 2); uint intExTemp = GetWindowLong(hwnd, GWL_EXSTYLE); } /// /// 鼠标穿透 /// public void chuantoulong() { SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED); } public void chuantoulong_fan() { SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_TRANSPARENT); } void OnRenderImage(RenderTexture from, RenderTexture to) { Graphics.Blit(from, to, m_Material); } const int WS_BORDER = 0; }

方法二、

效果最佳,无毛边效果

参考博客:

1、https://blog.csdn.net/q493201681/article/details/65936592

注意,需要将Camera设置为Solid Color,并将颜色改为黑色

关键代码:

using UnityEngine;using System.Collections;using System;using System.Runtime.InteropServices;using System.IO; /// /// 一共可选择三种样式/// public enum enumWinStyle{    ///     /// 置顶    ///     WinTop,    ///     /// 置顶并且透明    ///     WinTopApha,    ///     /// 置顶透明并且可以穿透    ///     WinTopAphaPenetrate}public class WinSetting : MonoBehaviour{     #region Win函数常量    private struct MARGINS    {        public int cxLeftWidth;        public int cxRightWidth;        public int cyTopHeight;        public int cyBottomHeight;    }     [DllImport("user32.dll")]    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);    [DllImport("user32.dll")]    static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);     [DllImport("user32.dll")]    static extern int GetWindowLong(IntPtr hWnd, int nIndex);     [DllImport("user32.dll")]    static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);     [DllImport("user32.dll")]    static extern int SetLayeredWindowAttributes(IntPtr hwnd, int crKey, int bAlpha, int dwFlags);     [DllImport("Dwmapi.dll")]    static extern uint DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS margins);    [DllImport("user32.dll")]    private static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);    private const int WS_POPUP = 0x800000;    private const int GWL_EXSTYLE = -20;    private const int GWL_STYLE = -16;    private const int WS_EX_LAYERED = 0x00080000;    private const int WS_BORDER = 0x00800000;    private const int WS_CAPTION = 0x00C00000;    private const int SWP_SHOWWINDOW = 0x0040;    private const int LWA_COLORKEY = 0x00000001;    private const int LWA_ALPHA = 0x00000002;    private const int WS_EX_TRANSPARENT = 0x20;    //    private const int ULW_COLORKEY = 0x00000001;    private const int ULW_ALPHA = 0x00000002;    private const int ULW_OPAQUE = 0x00000004;    private const int ULW_EX_NORESIZE = 0x00000008;    #endregion    //    public string strProduct;//项目名称    public enumWinStyle WinStyle = enumWinStyle.WinTop;//窗体样式    //    public int ResWidth;//窗口宽度    public int ResHeight;//窗口高度    //    public int currentX;//窗口左上角坐标x    public int currentY;//窗口左上角坐标y    //    private bool isApha;//是否透明    private bool isAphaPenetrate;//是否要穿透窗体    // Use this for initialization    void Awake()    {        Screen.fullScreen = false;        #if UNITY_EDITOR        print("编辑模式不更改窗体");        #else        switch (WinStyle)        {            case enumWinStyle.WinTop:                isApha = false;                isAphaPenetrate = false;                break;            case enumWinStyle.WinTopApha:                isApha = true;                isAphaPenetrate = false;                break;            case enumWinStyle.WinTopAphaPenetrate:                isApha = true;                isAphaPenetrate = true;                break;        }        //        IntPtr hwnd = FindWindow(null, strProduct);        //        if (isApha)        {            //去边框并且透明            SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_LAYERED);            int intExTemp = GetWindowLong(hwnd, GWL_EXSTYLE);            if (isAphaPenetrate)//是否透明穿透窗体            {                SetWindowLong(hwnd, GWL_EXSTYLE, intExTemp | WS_EX_TRANSPARENT | WS_EX_LAYERED);            }            //            SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_BORDER & ~WS_CAPTION);            SetWindowPos(hwnd, -1, currentX, currentY, ResWidth, ResHeight, SWP_SHOWWINDOW);            var margins = new MARGINS() { cxLeftWidth = -1 };            //            DwmExtendFrameIntoClientArea(hwnd, ref margins);        }        else        {            //单纯去边框            SetWindowLong(hwnd, GWL_STYLE, WS_POPUP);            SetWindowPos(hwnd, -1, currentX, currentY, ResWidth, ResHeight, SWP_SHOWWINDOW);        }        #endif    }}

下面是改良版,将功能拆分,便于扩展

using UnityEngine;using System.Collections;using System;using System.Runtime.InteropServices;using System.IO;/// /// 一共可选择三种样式/// public enum enumWinStyle{    ///     /// 置顶    ///     WinTop,    ///     /// 透明    ///     Apha,    ///     /// 置顶并且透明    ///     WinTopApha,    ///     /// 置顶透明并且可以穿透    ///     WinTopAphaPenetrate}public class WinSetting : MonoBehaviour{        #region Win函数常量    private struct MARGINS    {        public int cxLeftWidth;        public int cxRightWidth;        public int cyTopHeight;        public int cyBottomHeight;    }    [DllImport("user32.dll")]    private static extern IntPtr GetActiveWindow();    [DllImport("user32.dll")]    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);    [DllImport("user32.dll")]    static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);    [DllImport("user32.dll")]    static extern int GetWindowLong(IntPtr hWnd, int nIndex);    [DllImport("user32.dll")]    static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);    [DllImport("user32.dll")]    static extern int SetLayeredWindowAttributes(IntPtr hwnd, int crKey, int bAlpha, int dwFlags);    [DllImport("Dwmapi.dll")]    static extern uint DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS margins);    [DllImport("user32.dll")]    private static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);    private const int WS_POPUP = 0x800000;    private const int GWL_EXSTYLE = -20;    private const int GWL_STYLE = -16;    private const int WS_EX_LAYERED = 0x00080000;    private const int WS_BORDER = 0x00800000;    private const int WS_CAPTION = 0x00C00000;    private const int SWP_SHOWWINDOW = 0x0040;    private const int LWA_COLORKEY = 0x00000001;    private const int LWA_ALPHA = 0x00000002;    private const int WS_EX_TRANSPARENT = 0x20;    //    private const int ULW_COLORKEY = 0x00000001;    private const int ULW_ALPHA = 0x00000002;    private const int ULW_OPAQUE = 0x00000004;    private const int ULW_EX_NORESIZE = 0x00000008;    #endregion    //    public string strProduct;//项目名称    public enumWinStyle WinStyle = enumWinStyle.WinTop;//窗体样式    //    public int ResWidth;//窗口宽度    public int ResHeight;//窗口高度    //    public int currentX;//窗口左上角坐标x    public int currentY;//窗口左上角坐标y    //    private bool isWinTop;//是否置顶    private bool isApha;//是否透明    private bool isAphaPenetrate;//是否要穿透窗体    IntPtr hwnd;    // Use this for initialization    void Awake()    {        Screen.fullScreen = false;        //hwnd = FindWindow(null, strProduct);//可作用于其他进程的窗口        hwnd = GetActiveWindow();        //测试效果        RemoveRim();    }    //去掉边框且去掉任务栏图标    void RemoveRimAndIcon()    {        SetWindowLong(hwnd, GWL_STYLE, WS_POPUP);    }    //去掉边框    void RemoveRim()    {        SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_BORDER & ~WS_CAPTION);    }    //置顶    void SetTop()    {        SetWindowPos(hwnd, -1, currentX, currentY, ResWidth, ResHeight, SWP_SHOWWINDOW);    }    //设置透明:注意    //1、一定要先调用去掉边框的函数    //2、将camera 设置为Solid color,并将颜色设置为黑色    void SetTransparency()    {        var margins = new MARGINS() { cxLeftWidth = -1 };        DwmExtendFrameIntoClientArea(hwnd, ref margins);    }    //鼠标穿透窗体    void SetMouseThrough()    {        int intExTemp = GetWindowLong(hwnd, GWL_EXSTYLE);        SetWindowLong(hwnd, GWL_EXSTYLE, intExTemp | WS_EX_TRANSPARENT | WS_EX_LAYERED);    }  }

 去掉加载时窗体闪一下的效果

using UnityEngine;using System.Collections;using System;using System.Runtime.InteropServices;using System.IO;/// /// 一共可选择三种样式/// public enum enumWinStyle{    ///     /// 置顶    ///     WinTop,    ///     /// 透明    ///     Apha,    ///     /// 置顶并且透明    ///     WinTopApha,    ///     /// 置顶透明并且可以穿透    ///     WinTopAphaPenetrate}public class WinSetting : MonoBehaviour{    #region Win函数常量    private struct MARGINS    {        public int cxLeftWidth;        public int cxRightWidth;        public int cyTopHeight;        public int cyBottomHeight;    }    [DllImport("user32.dll")]    private static extern IntPtr GetActiveWindow();    [DllImport("user32.dll")]    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);    [DllImport("user32.dll")]    static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);    [DllImport("user32.dll")]    static extern int GetWindowLong(IntPtr hWnd, int nIndex);    [DllImport("user32.dll")]    static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);    [DllImport("user32.dll")]    static extern int SetLayeredWindowAttributes(IntPtr hwnd, int crKey, int bAlpha, int dwFlags);    [DllImport("Dwmapi.dll")]    static extern uint DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS margins);    [DllImport("user32.dll")]    private static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);    private const int WS_POPUP = 0x800000;    private const int GWL_EXSTYLE = -20;    private const int GWL_STYLE = -16;    private const int WS_EX_LAYERED = 0x00080000;    private const int WS_BORDER = 0x00800000;    private const int WS_CAPTION = 0x00C00000;    private const int SWP_SHOWWINDOW = 0x0040;    private const int LWA_COLORKEY = 0x00000001;    private const int LWA_ALPHA = 0x00000002;    private const int WS_EX_TRANSPARENT = 0x20;    //    private const int ULW_COLORKEY = 0x00000001;    private const int ULW_ALPHA = 0x00000002;    private const int ULW_OPAQUE = 0x00000004;    private const int ULW_EX_NORESIZE = 0x00000008;    #endregion    //    public string strProduct;//项目名称    public enumWinStyle WinStyle = enumWinStyle.WinTop;//窗体样式    //    public int ResWidth;//窗口宽度    public int ResHeight;//窗口高度    //    public int currentX;//窗口左上角坐标x    public int currentY;//窗口左上角坐标y    //    private bool isWinTop;//是否置顶    private bool isApha;//是否透明    private bool isAphaPenetrate;//是否要穿透窗体    IntPtr hwnd;    // Use this for initialization    void Awake()    {                Screen.fullScreen = false;//#if UNITY_EDITOR //       print("编辑模式不更改窗体");//#else        switch (WinStyle)        {            case enumWinStyle.WinTop:                isApha = false;                isAphaPenetrate = false;                break;            case enumWinStyle.Apha:                isWinTop = false;                isApha = true;                isAphaPenetrate = false;                break;            case enumWinStyle.WinTopApha:                isApha = true;                isAphaPenetrate = false;                break;            case enumWinStyle.WinTopAphaPenetrate:                isApha = true;                isAphaPenetrate = true;                break;        }                //        //IntPtr hwnd = FindWindow(null, strProduct);         hwnd = GetActiveWindow();        //        if (isApha)        {            //去边框并且透明            SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_LAYERED);            int intExTemp = GetWindowLong(hwnd, GWL_EXSTYLE);            if (isAphaPenetrate)//是否透明穿透窗体            {                SetWindowLong(hwnd, GWL_EXSTYLE, intExTemp | WS_EX_TRANSPARENT | WS_EX_LAYERED);            }            //            SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_BORDER & ~WS_CAPTION);            //保持中间位置:因为是从左上角算起的,所以获得屏幕像素后要减去窗体宽高的一半            currentX = Screen.currentResolution.width / 2-320/2;            currentY = Screen.currentResolution.height / 2-270/2;            SetWindowPos(hwnd, -1, currentX, currentY, ResWidth, ResHeight, SWP_SHOWWINDOW);            var margins = new MARGINS() { cxLeftWidth = -1 };            //            DwmExtendFrameIntoClientArea(hwnd, ref margins);                   }        else        {            //单纯去边框            SetWindowLong(hwnd, GWL_STYLE, WS_POPUP);            SetWindowPos(hwnd, -1, currentX, currentY, ResWidth, ResHeight, SWP_SHOWWINDOW);        }        Debug.Log(WinStyle);//#endif    }    void OnApplicationQuit()    {        //程序退出的时候设置窗体为0像素,从打开到走到awake也需要一定是时间        //会先有窗体边框,然后透明,这样会有闪一下的效果,        //设置窗体为0像素后,下次打开是就是0像素,走到awake再设置回来正常的窗口大小        //便能解决程序加载时会闪白色边框的现象        SetWindowPos(hwnd, -1, currentX, currentY, 0, 0, SWP_SHOWWINDOW);    }}

 方法三、

参考博客:

1、http://blog.sina.com.cn/s/blog_c0e6ab9b0102wn2s.html

注意,需要将Camera设置为Solid Color,并将颜色改为黑色,有毛边

关键代码:

//using System;//using System.Runtime.InteropServices;//using UnityEngine;//public class WindowMod : MonoBehaviour//{//    public enum appStyle//    {//        FullScreen,//        WindowedFullScreen,//        Windowed,//        WindowedWithoutBorder//    }//    public enum zDepth//    {//        Normal,//        Top,//        TopMost//    }//    private const uint SWP_SHOWWINDOW = 64u;//    private const int GWL_STYLE = -16;//    private const int WS_BORDER = 1;//    private const int GWL_EXSTYLE = -20;//    private const int WS_CAPTION = 12582912;//    private const int WS_POPUP = 8388608;//    private const int SM_CXSCREEN = 0;//    private const int SM_CYSCREEN = 1;//    public WindowMod.appStyle AppWindowStyle = WindowMod.appStyle.WindowedFullScreen;//    public WindowMod.zDepth ScreenDepth;//    public int windowLeft = 10;//    public int windowTop = 10;//    public int windowWidth = 800;//    public int windowHeight = 600;//    private Rect screenPosition;//    private IntPtr HWND_TOP = new IntPtr(0);//    private IntPtr HWND_TOPMOST = new IntPtr(-1);//    private IntPtr HWND_NORMAL = new IntPtr(-2);//    private int Xscreen;//    private int Yscreen;//    private int i;//    [DllImport("user32.dll")]//    private static extern IntPtr GetForegroundWindow();//    [DllImport("user32.dll", CharSet = CharSet.Auto)]//    public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hPos, int x, int y, int cx, int cy, uint nflags);//    [DllImport("User32.dll")]//    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);//    [DllImport("User32.dll")]//    private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);//    [DllImport("User32.dll")]//    private static extern int GetWindowLong(IntPtr hWnd, int dwNewLong);//    [DllImport("User32.dll")]//    private static extern bool MoveWindow(IntPtr hWnd, int x, int y, int width, int height, bool repaint);//    [DllImport("user32.dll", CharSet = CharSet.Auto)]//    public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);//    [DllImport("user32.dll", CharSet = CharSet.Auto)]//    public static extern int SendMessage(IntPtr hwnd, int msg, IntPtr wP, IntPtr IP);//    [DllImport("user32.dll", CharSet = CharSet.Auto)]//    public static extern IntPtr SetParent(IntPtr hChild, IntPtr hParent);//    [DllImport("user32.dll", CharSet = CharSet.Auto)]//    public static extern IntPtr GetParent(IntPtr hChild);//    [DllImport("User32.dll")]//    public static extern IntPtr GetSystemMetrics(int nIndex);//    private void Start()//    {//        this.Xscreen = (int)WindowMod.GetSystemMetrics(0);//        this.Yscreen = (int)WindowMod.GetSystemMetrics(1);//        if (this.AppWindowStyle == WindowMod.appStyle.FullScreen)//        {//            Screen.SetResolution(this.Xscreen, this.Yscreen, true);//        }//        if (this.AppWindowStyle == WindowMod.appStyle.WindowedFullScreen)//        {//            Screen.SetResolution(this.Xscreen - 1, this.Yscreen - 1, false);//            this.screenPosition = new Rect(0f, 0f, (float)(this.Xscreen - 1), (float)(this.Yscreen - 1));//        }//        if (this.AppWindowStyle == WindowMod.appStyle.Windowed)//        {//            Screen.SetResolution(this.windowWidth, this.windowWidth, false);//        }//        if (this.AppWindowStyle == WindowMod.appStyle.WindowedWithoutBorder)//        {//            Screen.SetResolution(this.windowWidth, this.windowWidth, false);//            this.screenPosition = new Rect((float)this.windowLeft, (float)this.windowTop, (float)this.windowWidth, (float)this.windowWidth);//        }//    }//    private void Update()//    {//        if (this.i < 5)//        {//            if (this.AppWindowStyle == WindowMod.appStyle.WindowedFullScreen)//            {//                WindowMod.SetWindowLong(WindowMod.GetForegroundWindow(), -16, 369164288);//                if (this.ScreenDepth == WindowMod.zDepth.Normal)//                {//                    WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_NORMAL, (int)this.screenPosition.x, (int)this.screenPosition.y, (int)this.screenPosition.width, (int)this.screenPosition.height, 64u);//                }//                if (this.ScreenDepth == WindowMod.zDepth.Top)//                {//                    WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_TOP, (int)this.screenPosition.x, (int)this.screenPosition.y, (int)this.screenPosition.width, (int)this.screenPosition.height, 64u);//                }//                if (this.ScreenDepth == WindowMod.zDepth.TopMost)//                {//                    WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_TOPMOST, (int)this.screenPosition.x, (int)this.screenPosition.y, (int)this.screenPosition.width, (int)this.screenPosition.height, 64u);//                }//                WindowMod.ShowWindow(WindowMod.GetForegroundWindow(), 3);//            }//            if (this.AppWindowStyle == WindowMod.appStyle.Windowed)//            {//                if (this.ScreenDepth == WindowMod.zDepth.Normal)//                {//                    WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_NORMAL, 0, 0, 0, 0, 3u);//                    WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_NORMAL, 0, 0, 0, 0, 35u);//                }//                if (this.ScreenDepth == WindowMod.zDepth.Top)//                {//                    WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_TOP, 0, 0, 0, 0, 3u);//                    WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_TOP, 0, 0, 0, 0, 35u);//                }//                if (this.ScreenDepth == WindowMod.zDepth.TopMost)//                {//                    WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_TOPMOST, 0, 0, 0, 0, 3u);//                    WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_TOPMOST, 0, 0, 0, 0, 35u);//                }//            }//            if (this.AppWindowStyle == WindowMod.appStyle.WindowedWithoutBorder)//            {//                WindowMod.SetWindowLong(WindowMod.GetForegroundWindow(), -16, 369164288);//                if (this.ScreenDepth == WindowMod.zDepth.Normal)//                {//                    WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_NORMAL, (int)this.screenPosition.x, (int)this.screenPosition.y, (int)this.screenPosition.width, (int)this.screenPosition.height, 64u);//                }//                if (this.ScreenDepth == WindowMod.zDepth.Top)//                {//                    WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_TOP, (int)this.screenPosition.x, (int)this.screenPosition.y, (int)this.screenPosition.width, (int)this.screenPosition.height, 64u);//                }//                if (this.ScreenDepth == WindowMod.zDepth.TopMost)//                {//                    WindowMod.SetWindowPos(WindowMod.GetForegroundWindow(), this.HWND_TOPMOST, (int)this.screenPosition.x, (int)this.screenPosition.y, (int)this.screenPosition.width, (int)this.screenPosition.height, 64u);//                }//            }//        }//        this.i++;//    }//}using UnityEngine;using System;using System.Collections;using System.Runtime.InteropServices;public class WindowMod : MonoBehaviour{    public Rect screenPosition;    [DllImport("user32.dll")]    static extern int GetWindowLong(IntPtr hwnd, int _nIndex);    [DllImport("user32.dll")]    static extern IntPtr SetWindowLong(IntPtr hwnd, int _nIndex, int dwNewLong);    [DllImport("user32.dll")]    static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);    [DllImport("user32.dll")]    static extern IntPtr GetForegroundWindow();    [DllImport("user32.dll")]    static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, int dwFlags);    const int SWP_SHOWWINDOW = 0x0040;    const int GWL_EXSTYLE = -20;    const int GWL_STYLE = -16;    const int WS_CAPTION = 0x00C00000;    const int WS_BORDER = 0x00800000;    const int WS_EX_LAYERED = 0x80000;    public const int LWA_ALPHA = 0x2;    public const int LWA_COLORKEY = 0x1;    private IntPtr handle;    void Start()    {        handle = GetForegroundWindow();        SetWindowLong(handle, GWL_EXSTYLE, WS_EX_LAYERED);        SetWindowLong(handle, GWL_STYLE, GetWindowLong(handle, GWL_STYLE) & ~WS_BORDER & ~WS_CAPTION);        SetWindowPos(handle, -1, (int)screenPosition.x, (int)screenPosition.y, (int)screenPosition.width, (int)screenPosition.height, SWP_SHOWWINDOW);        //把黑色透明化,不工作     //   SetLayeredWindowAttributes(handle, 0, 100, LWA_COLORKEY);        //把整个窗口透明化,工作        SetLayeredWindowAttributes(handle, 0, 100, LWA_ALPHA);    }    void LateUpdate()    {    }}

 

 

注:去掉边框的巧妙方法,适用于任何unity打包出来的exe,而且不用写一句代码。

步骤:

1、输入cmd,打开命令行。

2、在命令行上输入exe的路径  \***\***.exe

3、然后在后面敲一个空格,输入-popupwindow

4、回车

这样操作下来,程序运行起来是没有边框的。

同样:将-popupwindow 改为,-nolog 程序运行起来就会没有output_log.txt log文件。

妙用还有很多,请参考官方文档

 

转载于:https://www.cnblogs.com/Jason-c/p/9414573.html

你可能感兴趣的文章
【android】使用handler更新UI
查看>>
mochiweb 源码阅读(十五)
查看>>
前端面试中的常见的算法问题
查看>>
计算机语言的基本理论
查看>>
nodejs流之行读取器例子
查看>>
批量文件重命名工具
查看>>
简单说一下UWP中的JumpList
查看>>
unity将object[]或者string对象转换成枚举enum
查看>>
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.19. 范围函数和操作符...
查看>>
以太坊系列之六: p2p模块--以太坊源码学习
查看>>
使用scikit-learn解决文本多分类问题(附python演练)
查看>>
2018 年最值得关注的 JavaScript 趋势
查看>>
什么是区块链?超级账本 Brian Behlendorf 从五个方面教你认识
查看>>
Linux中的帮助功能
查看>>
针对Android的Pegasus恶意软件版本和针对iOS的有什么不同?
查看>>
全局探色器
查看>>
Hive Export和Import介绍及操作示例
查看>>
http://mongoexplorer.com/ 一个不错的 mongodb 客户端工具。。。
查看>>
Xcode 4.3 使用xcodebuild命令编译项目环境设置
查看>>
上传jar包到nexus私服
查看>>