设置窗口透明、窗口置顶、鼠标穿透
方法一、
缺点:边缘不平滑,有毛边
参考博客:
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文件。
妙用还有很多,请参考官方文档