Winform实现鼠标可穿透的窗体镂空效果
今天找到一个名叫LICEcap的录屏软件,录制界面是这样的:
     
这个炫酷的空心窗口就是镜头,调整好大小,然后对准需要录制的地方按下Record就可以生成gif了。
卧槽太NB了我也要做一个!
根据StackOverflow站的提示(在这里),我们需要使用一个在Windows2000及之后平台可用的,用以实现不规则窗体的分层窗口API (SetLayerWindowAttributes).根据百度我们先需要使用一个名为SetWindowLong的Win32 API来把窗体设定为分层窗体。
为了在.NET平台中调用Win32 API,我们需要复习下P/Invoke的内容:
- 1.什么是P/Invoke
 
P/Invoke 的全称是Platform Invoke。.是一种在托管平台下使用非托管dll中导出函数的一种调用机制。
- 2.如何用P/Invoke
 
它长这样:
[DllImportAttribute("user32.dll", EntryPoint="SetCursorPos")]
 public static extern  bool SetCursorPos(int X, int Y) ;
依次指明调用的dll名称,导出函数名,然后定义成C#标准的方法就行了。
所以,我们需要: 打开百度百科,搜索API名称,查看宿主dll,抄来函数原型,按照说明定义需要的常量。
不,这里有更方便的办法:打开pinvoke.net,搜索API名称:
    
按照里边的C#Signature复制过来,再根据Sample Code改改,就OK了。
然后在Visual Studio里新建一个Winform项目,在主窗口代码里这样写:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.TopMost = true;
SetWindowLong(this.Handle, GWL_EXSTYLE, WS_EX_LAYERED);
SetLayeredWindowAttributes(this.Handle, , , LWA_COLORKEY);
}
private const uint WS_EX_LAYERED = 0x80000;
private const int GWL_EXSTYLE = -;
private const int LWA_COLORKEY = ; [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,并设置了背景颜色。
    
F5运行,效果如图:
  
能想到的用处之一就是,包装几个不相关的外部程序为一个整体.
Winform实现鼠标可穿透的窗体镂空效果的更多相关文章
- C#WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置
		
C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...
 - C#WinForm无边框窗体移动----模仿鼠标单击标题栏移动窗体位置
		
C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...
 - Winform 基础二 最小化 最大化 关闭 点击任务栏隐藏显示 点击鼠标左键移动窗体
		
一 最大化 二 最小化 三 关闭 四 点击任务栏隐藏显示 五 点击鼠标左键移动窗体 六 阴影效果鼠标左键移动窗口 #region UI设置 最大化.最小化.关闭.鼠标移动窗口.点击任务栏切换窗口 th ...
 - winform 以不规则图形背景显示窗体
		
一:创建一个winform窗体,把BackgroundImage引入一个不规则的图片,设置属性BackgroundImageLayout为Stretch 二:主要代码 using System; us ...
 - C# WinForm 单例模式(例:同一个窗体只创建一次实例)
		
//C# WinForm 单例模式(例:同一个窗体只创建一次实例) //打开窗体的事件: Form3 f = Form3.InstanceObject() ; //实例化窗体 f.Focus(); / ...
 - WinForm窗体淡入效果界面的简单实现方法
		
WinForm窗体淡入效果主要使用到控件的Opacity属性 首先在WinForm窗体中拖入一个Timer控件,然后再Timer控件的Tick事件添加如下代码: private void timer1 ...
 - jQuery鼠标悬停显示提示信息窗体
		
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
 - WinForm - 窗体淡入效果界面的简单实现方法
		
WinForm窗体淡入效果主要使用到控件的Opacity属性 首先在WinForm窗体中拖入一个Timer控件,然后再Timer控件的Tick事件添加如下代码: private void timer1 ...
 - DWM 窗体玻璃效果实现
		
我一直盼望着 Windows 新版本的发布.令人感兴趣的事情莫过于浏览 MSDN® 和 SDK 文档,查找一些可以利用和依赖的最新创新,然后让朋友和同事以及您的老板(如果幸运的话)大开眼界.Windo ...
 
随机推荐
- [Angular 2] Set Properties on Dynamically Created Angular 2 Components
			
When you generate Angular 2 components, you’re still able to access the component instance to set pr ...
 - EJB究竟是什么,真的那么神奇吗??
			
1. 我们不禁要问,什么是"服务集群"?什么是"企业级开发"? 既然说了EJB 是为了"服务集群"和"企业级开发",那么 ...
 - javascript 变量解析
			
1.JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析).当你使用了一个变量,然后不久 ...
 - QQ会员AMS平台PHP7升级实践
			
作者:徐汉彬链接:https://zhuanlan.zhihu.com/p/21493018来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. QQ会员活动运营平台(AMS ...
 - nginx的监控配置
			
最近在弄性能,在性能过程中需要监控nginx的一些配置,这里简单的搭建了环境 //下载nginx 根据自己的版本 wget http://nginx.org/download/nginx-1.6.0 ...
 - Java最重要的21个技术点和知识点之JAVA集合框架、异常类、IO
			
(三)Java最重要的21个技术点和知识点之JAVA集合框架.异常类.IO 写这篇文章的目的是想总结一下自己这么多年JAVA培训的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享 ...
 - Socket 之 API函数介绍
			
1.创建套接字──socket() 应用程序在使用套接字前,首先必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段,其调用格式如下: SOCKET PASCAL FAR soc ...
 - EntityFramework优缺点(转)
			
Entity Framework 是微软推荐出.NET平台ORM开发组件, 现在已放源代码. 以下我们来讨论一下优缺点和一些问题, 以下简称EF. 有兴趣可查询官网的Entity Framewo ...
 - iOS ----Pods-resources.sh Permission denied
			
1:执行指令 chmod a+x "路径(Pods-resources.h文件所在的路径)" 2:cd 进如pods文件夹下面 3:执行指令 第一步: sudo chmod 777 ...
 - 干货:VLDB论文摘要-阿里技术突破性创新
			
阿里技术突破性创新 世界顶级大规模数据处理分析管理会议VLDB(VERY LARGE DATA BASE)于9月1日至5日在杭州举办,该会议也是也是大数据云计算领域的盛会,阿里巴巴两个团队在这个会议上 ...