首页 > 编程语言 >C# WINFORM 屏幕绘画+透明窗体+鼠标穿透

C# WINFORM 屏幕绘画+透明窗体+鼠标穿透

时间:2023-08-15 14:58:06浏览次数:39  
标签:透明 鼠标 C# 穿透 df 窗体 showForm WINFORM

通过长时间研究终于找到关于在C# WINFORM下制作真正的透明窗体在系统桌面上画图的完美解决方案;

可以避免解决与其网上其它画图工具的很多不足,网上实现思路如下几种:

1、使用API透明窗体+底层鼠标钩子可以实现,但要重新实现鼠标的监听操作,实再太麻烦了;

2、使用第三方透明窗体控件(如LayeredSkin等),也可成功但需通过UpdateLayeredWindow实现,而且记录轨迹多层画布也会出现不透明无法透视到系统桌面问题;

3、大部分画图工具都采用抓假桌面背景图进行画图,不能完全时时看到桌面其它程序运行的界面;

4、直接在透明窗体上画,使用TransparencyKey会出现透明窗体鼠标穿透现像,而使用Opacity则字迹也会被透明看不清;

5、使用Paint重绘窗体画布背色为Color.FromArgb(1, 255, 255, 255)强制透明在XP系统下可以用,但在WIN7以上系统还是会穿透,因为FrameWork底层透明操作都是使用API的SetLayeredWindowAttributes参数实现的。

以上方式我都试过,通过总结教训取长补短最终简单有效解决方案思路如下:

我的解决方案为两层透明窗体重叠,一层透明窗体showForm显示图像(TransparencyKey因为鼠标穿透,但字迹显示清楚正常),用另一层窗体drawForm做绘图轨迹(Opacity鼠标不穿透,可以不必显示图像),两个都为透明窗体,Opacity透明绘图层的轨迹在透明窗体TransparencyKey图画层上显示,直接上代码:

drawForm.cs只新建窗体drawForm即可,可以不用写其它代码,功能都在showForm中完成;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace draw
{
    public partial class showForm : Form
    {
        private drawForm df;//透明窗体不穿透鼠标
        private bool startdraw = false;//是否开始画图
        private Graphics gs;//画版
        private Pen pen;//画笔
        private Point startpt;//画图起点
        public showForm()
        {
            InitializeComponent();
            WindowState = FormWindowState.Maximized;//本窗体最大化
            TransparencyKey = BackColor;//背景透明(鼠标穿透)
            DoubleBuffered = true;//双缓存处理

            df = new drawForm();//不穿透鼠标透明窗体
            //设置不穿透鼠标透明窗体画板鼠标事件为本显示画图窗体鼠标事件进行同步
            df.MouseDown += showForm_MouseDown;//鼠标按下事件
            df.MouseMove += showForm_MouseMove;//鼠标移动事件
            df.MouseUp += showForm_MouseUp;//鼠标弹起事件

            //不穿透鼠标透明窗体参数设置如下
            df.WindowState = FormWindowState.Maximized;//最大化
            df.Opacity = 0.1;//背景透明不穿透鼠标
            df.TopMost = true;//让不穿透鼠标透明窗体画板为最上层
            df.DoubleBuffered = true;//双缓存处理
            df.Show();//显示
            gs = CreateGraphics();//创建窗体画板
            pen = new Pen(Color.Black, 3f);//画笔
        }

        private void showForm_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                startdraw = true;//开始画图
                startpt = e.Location;
            }
        }

        private void showForm_MouseMove(object sender, MouseEventArgs e)
        {
            if (startdraw)
            {
                gs.DrawLine(pen, startpt, e.Location);
                startpt = e.Location;
            }
        }

        private void showForm_MouseUp(object sender, MouseEventArgs e)
        {
            startdraw = false;//结束画图
        }
    }
}

下载地址:http://download.csdn.net/detail/litongshun/9108699

标签:透明,鼠标,C#,穿透,df,窗体,showForm,WINFORM
From: https://www.cnblogs.com/guangzhiruijie/p/17631261.html

相关文章

  • Net7配置Autofac下IOC中的AOP,以及Autofac的三种生命周期写法
    Net7配置Autofac下IOC中的AOP是分两种,一种是基于接口的,一种是基于实现类的基于接口的好处是简单,但不能有效的控制具体到某个方法。也就是说,只能基于类来做操作,一个类下所有的方法都要接受注册基于实现类的是稍微麻烦一点,生效方法必须改为virtual,但可以实现到具体某个方法的效......
  • Docker的仓库管理
    Docker的中央仓库谁提供了这样的仓库呢?......
  • WPS RCE漏洞 学习
    复现过程2023年HW出现WPS0dayPOC影响版本:WPSOffice2023个人版<11.1.0.15120WPSOffice2019企业版<11.8.2.12085简单操作,安装指定版本以下的wps版本设置host为127.0.0.1clientweb.docer.wps.cn.cloudwps.cn在poc目录下打开cmd,启动简单的http服务......
  • 我的BIOS之行7-protocol的使用与创建
    protocol简介从语言上来看,protocol包含了属性和函数指针的结构体,从功能上看,protocoll是提供者与使用者对服务方式的一种约定。其实我们不难看出UEFI中的Protocol引入了面向对象的思想。每一个protocol都必须要有一个唯一的GUID。如我的github上面的code一样,在github上我每章都有......
  • spring mvc 前端返回 js
    @RequestMapping(value="/test",produces="text/html;charset=UTF-8")@ResponseBodypublicStringtest(){Stringurl="";return"<script>window.location.href='"+url+"';</script>"; ......
  • CSS3---------------渐变
    一、渐变--(gradient)#、CSS3渐变(gradients)可以让你在两个或多个指定颜色之间显示平稳的过度,包括透明度。CSS3定义了两种类型的渐变(gradients):1.线性渐变(LinearGradients)-向下、向上、向左、向右、对角方向:(tobottom、totop、toright、toleft、tobo......
  • 跨界电商战略中的Socks5代理与数据抓取
    一、Socks5代理:基本原理与特点Socks5代理(SK5代理)是一种IP代理技术,采用SOCKS5协议。相比传统IP代理,Socks5代理支持TCP和UDP协议,具备更强大的性能和隐私保护能力。Socks5代理工作原理:当用户请求访问目标服务器时,请求经由Socks5代理服务器转发。代理服务器隐藏了用户真实IP地址,将请求......
  • 服务器数据恢复-EqualLogic存储RAID5硬盘坏道导致存储崩溃的数据恢复案例
    服务器数据恢复环境:一台DELLEqualLogic存储中有一组由16块SAS硬盘组建的RAID5阵列。存储存放虚拟机文件,采用VMFS文件系统,划分了4个lun。服务器故障&检测&分析:存储设备上有两个硬盘指示灯显示黄色,存储不可用。存储设备已经过保。对故障存储中的16块硬盘做硬件故障检测,发现其中......
  • K8S故障注入混沌工程开源平台ChaosMesh
    ChaosMesh是针对K8S的云原生混沌工程开源平台。可以用它方便地模拟开发、测试、生产环境中可能出现的各种异常情况,发现系统中潜在的问题。创建者研发支持混合事务与分析处理的开源数据库TiDB的PingCap公司一句话介绍ChaosMesh是针对K8S的云原生开源混沌工程平台。关键特性......
  • 跨界电商战略中的Socks5代理与数据抓取
    一、Socks5代理:基本原理与特点Socks5代理(SK5代理)是一种IP代理技术,采用SOCKS5协议。相比传统IP代理,Socks5代理支持TCP和UDP协议,具备更强大的性能和隐私保护能力。Socks5代理工作原理:当用户请求访问目标服务器时,请求经由Socks5代理服务器转发。代理服务器隐藏了用户真实IP地址,将请求......