Winform控件镂空、窗体本身镂空和鼠标击穿(录屏会用到)

需要提前说明一下:

win7系统比较特殊,下面将要说到PictureBox控件的背景色BackColor

1   BackColor设为绿色时,PictureBox,既不被鼠标击穿,也不透明;

2   BackColor设为蓝色时,PictureBox,可以被鼠标击穿,但不透明;

3    BackColor设为黑色时,PictureBox,可以被鼠标击穿,并且透明(满足要求);

但这位老兄https://blog.csdn.net/rediculous/article/details/8877638说:Win7下VS2010编程时,关键色只能是绿色或黑色。

转入正题:

下面的内容均转自:https://www.cnblogs.com/ifdog/p/5940015.html#commentform

注意:我在它的内容上做了一些修改:

这家伙做这个需求的目的源于一个叫LICEcap的录屏软件(这个软件我手上有一个,免安装的),他想做的效果如下

这个炫酷的空心窗口就是镜头,调整好大小,然后对准需要录制的地方按下Record就可以生成gif了。

一      操作控件透明和被鼠标击穿的步骤:

1   在Visual Studio里新建一个Winform项目,并拖入一个PictureBox控件并设置其属性BackColor为Green,如下图:

注意了:BackColor属性的设置,如果在win7下就要注意了,文章开头已经说了

2   在主窗体程序编写如下:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.TopMost = true;
            SetWindowLong(this.Handle, GWL_EXSTYLE, WS_EX_LAYERED);
            SetLayeredWindowAttributes(this.Handle, 65280, 255, LWA_COLORKEY);
        }
        private const uint WS_EX_LAYERED = 0x80000;
        private const int GWL_EXSTYLE = -20;
        private const int LWA_COLORKEY = 1;

        [DllImport("user32", EntryPoint = "SetWindowLong")]
        private static extern uint SetWindowLong(IntPtr hwnd,int nIndex,uint dwNewLong);

        [DllImport("user32", EntryPoint = "SetLayeredWindowAttributes")]
        private static extern int SetLayeredWindowAttributes(IntPtr hwnd,int crKey,int bAlpha,int dwFlags);
    }

先使用SetWindowLong将窗口定义为分层窗体,然后调用SetLayeredWindowAttributes方法设置透明。

  其中第二个参数crKey为一个int型的颜色值,转换方式为(int)(0xRRGGBB),本例中Dec(0x00FF00)=65280为绿色。

  第四个参数为透明方式,本例中使用LWA_COLORKEY = 1,表示将该窗口颜色为crKey的部分都设置为透明。

  因此相应地,我们需要在窗口设计器中画一个颜色为绿色的方块。本例中使用了一个PictureBox,并设置了背景颜色。

注意:

1  如果PictureBox的背景色为黑色,则代码SetLayeredWindowAttributes(this.Handle, 65280, 255, LWA_COLORKEY)中的65280改为0

2 如果PictureBox的背景色为蓝色,则代码SetLayeredWindowAttributes(this.Handle, 65280, 255, LWA_COLORKEY)中的65280改为255

3  最终效果如下:

二    整个窗体被鼠标击穿和透明

只需要在窗体程序中加入TransparencyKey = BackColor即可,如下:

        public Form1()
        {
            InitializeComponent();
            TransparencyKey = BackColor;//背景透明(鼠标穿透)
             
            
           
        }

其它的就不要了

发布了66 篇原创文章 · 获赞 48 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/zxy13826134783/article/details/103097204