2017-08-05 92 views
0

我想弄清楚这个代码是如何工作的,但我无法弄清楚是什么让它点击。是什么让这个点击槽?

是的,这段代码不是我的,因为我试图学习/理解它。

假设我想要透明,但不是点击通过需要改变什么,为什么?

我一遍又一遍地翻过了Windows styles页面,仍然无法理解点击部分。

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; 
    } 

    [DllImport("user32.dll")] 
    private static extern IntPtr GetActiveWindow(); 

    [DllImport("user32.dll")] 
    private static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong); 

    [DllImport("user32.dll")] 
    static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); 

    [DllImport("user32.dll", EntryPoint = "SetLayeredWindowAttributes")] 
    static extern int SetLayeredWindowAttributes(IntPtr hwnd, int crKey, byte bAlpha, int dwFlags); 

    [DllImport("user32.dll", EntryPoint = "SetWindowPos")] 
    private static extern int SetWindowPos(IntPtr hwnd, int hwndInsertAfter, int x, int y, int cx, int cy, int uFlags); 

    [DllImport("Dwmapi.dll")] 
    private static extern uint DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS margins); 

    const int GWL_STYLE = -16; 
    const uint WS_POPUP = 0x80000000; 
    const uint WS_VISIBLE = 0x10000000; 
    const int HWND_TOPMOST = -1; 

    void Start() 
    { 
     #if !UNITY_EDITOR // You really don't want to enable this in the editor.. 

     int fWidth = Screen.width; 
     int fHeight = Screen.height; 
     var margins = new MARGINS() { cxLeftWidth = -1 }; 
     var hwnd = GetActiveWindow(); 

     SetWindowLong(hwnd, GWL_STYLE, WS_POPUP | WS_VISIBLE); 

     // Transparent windows with click through 
     SetWindowLong(hwnd, -20, 524288 | 32);//GWL_EXSTYLE=-20; WS_EX_LAYERED=524288=&h80000, WS_EX_TRANSPARENT=32=0x00000020L   
     SetLayeredWindowAttributes(hwnd, 0, 255, 2);// Transparency=51=20%, LWA_ALPHA=2 
     SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, fWidth, fHeight, 32 | 64); //SWP_FRAMECHANGED = 0x0020 (32); //SWP_SHOWWINDOW = 0x0040 (64) 
     DwmExtendFrameIntoClientArea(hwnd, ref margins); 

     #endif 
    } 

    void OnRenderImage(RenderTexture from, RenderTexture to) 
    { 
     Graphics.Blit(from, to, m_Material); 
    } 
} 

回答

0

此功能:

SetWindowLong(hwnd, -20, 524288 | 32); 

的伎俩。 Windows实现了Mircosoft所做的规则,即对用户透明的窗口必须对鼠标透明。 将透明度位设置为WS_EX_TRANSPARENT时,该窗口对于鼠标也变得透明,并单击传递到透明窗口后面的已绘制图层。

你不需要理解,但可以利用这个'OS功能',它可能被用来掩盖别的东西。

阅读本article这个话题,这answer解释参数

+0

谢谢你,这是非常丰富的。我可悲的还不能upvote。 –