需要提前说明一下:
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;//背景透明(鼠标穿透)
}
其它的就不要了