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方法刷新桌面,清除绘制的图形