你的位置:首页 > ASP.net教程

[ASP.net教程]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, 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,并设置了背景颜色。

 

    

 

    F5运行,效果如图:

 

    

    能想到的用处之一就是,包装几个不相关的外部程序为一个整体.




深圳旅游攻略2015自助游深圳旅游攻略必去景点深圳旅游攻略两天路线深圳旅游攻略自由行深圳旅游景点排行榜今年就这样耍 陕西全年旅游时刻表 那琴半岛地质海洋公园适合孩子玩吗?台山海洋公园有哪些娱乐项目? 那琴半岛地质海洋公园游玩攻略?台山海洋公园游玩路线推荐? 天津夜景是什么颜色 盘点津城出名夜景地 五桂山逍遥谷吃饭方便吗?逍遥谷住宿? 五桂山逍遥谷地图?逍遥谷游玩路线? 五桂山逍遥谷游泳价格?逍遥谷收费标准? 五桂山逍遥谷游玩时间?逍遥谷开放时间? 永记生态园滑草多少钱?惠州永记生态园有滑草场吗? 中秋节去高明盈香生态园有什么活动?盈香生态园中秋节晚上有演出吗? 2015盈香生态园中秋节活动?高明盈香生态园中秋节门票多少钱? 9月25日起常州机场每周有两班飞机到香港 龙门川龙峡漂流怎么样?惠州龙门川龙峡漂流旅游攻略? 石花水洞凭本地身份证有优惠吗?儋州石花水洞优惠票怎么买? 和平热龙漂流在哪里?热龙漂流具体地址? 滑雪基地崇礼的夏日风情 Q65110A8617 Datasheet Q65110A8617 Datasheet Q65110A8618 Datasheet Q65110A8618 Datasheet Q65110A8620 Datasheet Q65110A8620 Datasheet 广州越秀公园好玩吗 广州越秀公园好玩吗 广州越秀公园好玩吗 惠州海龟自然保护区 惠州海龟自然保护区 惠州海龟自然保护区 清远青龙峡漂流 清远青龙峡漂流 清远青龙峡漂流