C#调用windows API桌面绘制半透明图形,清除绘制内容

  之前做过一个截图工具,通过winform做的遮罩层,这段时间想要通过绘制遮罩层的方法来取代winform,第一步就是在桌面半透图形的绘制了。 这里记录下实现代码,只要包括两部分内容。 1.在桌面绘制半透明图形。 2.清楚桌面绘制的内容。

/// <summary>
        /// 获取桌面的句柄
        /// </summary>
        /// <returns></returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern IntPtr GetDesktopWindow();

        /// <summary>
        /// 获取上下文的句柄
        /// </summary>
        /// <param name="hWnd">控件的句柄</param>
        /// <param name="hrgnClip">指定一剪切区域</param>
        /// <param name="flags">指定如何创建设备上下文环境</param>
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "GetDCEx", CharSet = CharSet.Auto, ExactSpelling = true)]
        private static extern IntPtr GetDCEx(IntPtr hWnd, IntPtr hrgnClip, int flags);

        /// <summary>
        /// 获取控件的位置和大小
        /// </summary>
        /// <param name="hWnd">控件的句柄</param>
        /// <param name="rect">返回的控件位置和大小信息</param>
        /// <returns></returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        internal static extern bool GetWindowRect(IntPtr hWnd, ref Rectangle rect);

        /// <summary>
        /// 重绘指定区域
        /// </summary>
        /// <param name="hwnd">重绘的控件句柄</param>
        /// <param name="rcUpdate">要刷新的范围</param>
        /// <param name="hrgnUpdate">一个“区”的句柄,这个区描述了要重画的窗口区域</param>
        /// <param name="flags">规定具体重画操作的旗标</param>
        /// <returns></returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern bool RedrawWindow(IntPtr hwnd, ref Rectangle rcUpdate, IntPtr hrgnUpdate, int flags);

        /// <summary>
        /// 在桌面上绘制填充半透明
        /// </summary>
        public void DrawingFullScreen()
        {
            // 获取桌面句柄
            IntPtr desk = GetDesktopWindow();

            // 获取桌面在上下文环境的句柄
            IntPtr deskDC = GetDCEx(desk, IntPtr.Zero, 0x403);

            // 获取桌面的范围
            Rectangle focusRect = new Rectangle();
            GetWindowRect(desk, ref focusRect);

            // 创建绘制对象
            Graphics g = Graphics.FromHdc(deskDC);

            // 定义半透明刷子
            SolidBrush sb = new SolidBrush(Color.FromArgb(80, 255, 255, 255));

            // 填充桌面
            g.FillRectangle(sb, focusRect);
            g.Dispose();
        }

        /// <summary>
        /// 重新刷新桌面,而从清楚绘制内容
        /// </summary>
        public void ClearFullScreen()
        {
            // 获取桌面句柄
            IntPtr desk = GetDesktopWindow();

            // 获取桌面的范围
            Rectangle focusRect = new Rectangle();
            GetWindowRect(desk, ref focusRect);

            // 重绘桌面            
            RedrawWindow(desk, ref focusRect, IntPtr.Zero, 0x85);
        }

实现过程:

1.通过api GetDesktopWindow获取桌面的句柄

2.Color.FromArgb(80, 255, 255, 255) rgb不用说了,代表三原色,a(Alpha)代表图像通道,取值范围(0 - 255) ,用来设置图像的透明度。

3.根据获得的桌面句柄创建Graphics对象,绘制图形 4.通过api的RedrawWindow方法刷新桌面,清除绘制的图形

posted on 2012-10-17 16:32  猿人甲  阅读(2016)  评论(0编辑  收藏  举报