2017-08-05 5 views
0

J'essaie de comprendre comment ce code fonctionne, mais je n'arrive pas à comprendre ce qui le fait cliquer.Qu'est-ce qui fait ce cliquetis?

Oui, ce code n'est pas le mien puisque j'essaie de l'apprendre/de le comprendre. Je suppose que je veux la transparence mais pas le clic sur ce qui doit être changé et pourquoi?

J'ai été sur le Windows styles pages encore et encore et ne peux toujours pas obtenir ma tête autour de la partie de clic.

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

Répondre

0

Cette fonction:

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

fait l'affaire. Windows implémente la règle créée par Mircosoft, à savoir qu'une fenêtre transparente à l'utilisateur doit être transparente pour la souris. Avec le jeu de bits de transparence WS_EX_TRANSPARENT, la fenêtre devient transparente pour la souris et un clic passe à la couche peinte derrière la fenêtre transparente.

Vous n'avez pas besoin de comprendre mais d'utiliser cette 'fonctionnalité du système d'exploitation' qui a probablement été implémentée pour couvrir autre chose.

Lire cette article sur le sujet et ce answer qui explique les paramètres

+0

Merci ce a été très instructif. Je ne peux malheureusement pas encore upvote. –