学习时,在网上找了一段穿透窗体的代码,感觉很不错,记录一下!!同时谢谢该作者,不过忘记了是从哪找到的了

private const uint WS_EX_LAYERED = 0x80000;

        private const int WS_EX_TRANSPARENT = 0x20;

        private const int GWL_STYLE = (-16);

        private const int GWL_EXSTYLE = (-20);

        private const int LWA_ALPHA = 0x2;

 

        public Form1()

        {

            InitializeComponent();

 

            CanPenetrate();//使窗体有鼠标穿透功能

        }

 

        [DllImport("user32", EntryPoint = "SetWindowLong")]

        private static extern uint SetWindowLong(

        IntPtr hwnd,

        int nIndex,

        uint dwNewLong

        );

 

        [DllImport("user32", EntryPoint = "GetWindowLong")]

        private static extern uint GetWindowLong(

        IntPtr hwnd,

        int nIndex

        );

 

        [DllImport("user32", EntryPoint = "SetLayeredWindowAttributes")]

        private static extern int SetLayeredWindowAttributes(

        IntPtr hwnd,

        int crKey,

        int bAlpha,

        int dwFlags

        );

 

        /// <summary>

        /// 使窗体有鼠标穿透功能

        /// </summary>

        public void CanPenetrate()

        {

            uint intExTemp = GetWindowLong(this.Handle, GWL_EXSTYLE);

            uint oldGWLEx = SetWindowLong(this.Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED);

            SetLayeredWindowAttributes(this.Handle, 0, 100, LWA_ALPHA);

        }

 参数的意思:

   hWnd是透明窗体的句柄,


  crKey为掩码的颜色,可以用RGB(r,g,b)来指定。


  bAlpha是不透明度,取值范围是(0,255),其中0代表全透明,255代表不透明。


  dwFlags是透明方式,可以取两个值:


  当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;


  当取值为LWA_COLORKEY时,窗体中的所有颜色为crKey的地方将变为透明,bAlpha参数无效。


  LWA_ALPHA = 0x2


  LWA_COLORKEY=0x1


  也可以取两个值的组合:LWA_ALPHA Or
LWA_COLORKEY。这样crKey的地方将变为全透明,而其它地方根据bAlpha参数确定透明度。


  

posted on 2012-08-24 21:13  啄木鸟家园  阅读(663)  评论(0编辑  收藏  举报