项目马上上线,因为之前的登录器是使用VS2010的MFC做的,在很多电脑上会提示缺失mfcXXXX.dll,中间找寻这种解决方案,最后确定将vcredist2010_x86和我的程序打包到安装包里面,每次安装的时候默认先安装vcredist2010_x86。

  由此,经常被杀毒软件阻止,而且还有x64 or x86的区别。

  同时,甲方想要一个精灵,类似于QQ宠物,于是PL决定使用精灵模型+异形窗口做一个桌面宠物。于是,异形窗口成了此物的基础。

  首先,我们需要了解的是,异形窗口是什么。简单来说,即将窗口形状变成由一张不规则(一般由透明色决定)图片所决定的形状。

  然后,需要知道的是窗口的形状是由什么决定。在MSDN上我发现,普通的窗口形状由一个简单的Rectangular Region决定。经查询之后,要实现异形窗口主要要靠这几个函数:

  a. 创建一个矩形区域

//The CreateRectRgn function creates a rectangular region. 
HRGN CreateRectRgn(
int nLeftRect, // x-coordinate of upper-left corner
int nTopRect, // y-coordinate of upper-left corner
int nRightRect, // x-coordinate of lower-right corner
int nBottomRect // y-coordinate of lower-right corner
);

  b. 结合n个矩形区域

//The CombineRgn function combines two regions and stores the result in a third region.
//The two regions are combined according to the specified mode. int CombineRgn(
HRGN hrgnDest, // handle to destination region
HRGN hrgnSrc1, // handle to source region
HRGN hrgnSrc2, // handle to source region
int fnCombineMode // region combining mode
);

  c. 将窗口显示出来

//The SetWindowRgn function sets the window region of a window.
//The window region determines the area within the window where the system permits drawing.
//The system does not display any portion of a window that lies outside of the window region int SetWindowRgn(
HWND hWnd, // handle to window
HRGN hRgn, // handle to region
BOOL bRedraw // window redraw option
);

  d. 去掉窗口标题栏(主要窗口截图只能截到窗口边框内)

//This function changes an attribute of the specified window.
//SetWindowLong also sets a 32-bit (LONG) value at the specified offset into the extra window memory of a window.
LONG SetWindowLong(
HWND hWnd,
int nIndex,
LONG dwNewLong
);

  

  最后,在unity里面调用user32.dll 和 Gdi32.dll 两个动态链接库,结合unity界面截图,得到最后的处理结果。贴上部分处理代码:

 /// <summary>
/// use the screen shot image to cut the window.
/// </summary>
private void updateWindow() {
System.IntPtr hRgn = WinAPI.CreateRectRgn(, , , ); Debug.Log(" width: " + winTex2d.width + " height: " + winTex2d.height); for (int h = ; h < winTex2d.height; ++h) {//int h = tex2d.height - 1; h > tex2d.height/2; --h
//Debug.Log(tex2d.GetPixel(h, h));
int w = ;
do {
while (w < winTex2d.width && (winTex2d.GetPixel(w, winTex2d.height - h) == Color.clear
|| winTex2d.GetPixel(w, h) == Color.black
)) {
++w;
//Debug.Log(tex2d.GetPixel(w, h));
}
int iLeftX = w;
while (w < winTex2d.width && (winTex2d.GetPixel(w, winTex2d.height - h) != Color.clear
//|| tex2d.GetPixel(w, h) != Color.black
)) {
++w;
//Debug.Log(tex2d.GetPixel(w, h));
}
//Debug.Log("ileftX: " + iLeftX + "w: " + w + h); WinAPI.CombineRgn(hRgn, hRgn, WinAPI.CreateRectRgn(iLeftX, h, w, h + ), );
}//end do{}
while (w < winTex2d.width);
}//end for(h); Debug.Log("setWindowRgn: " + WinAPI.SetWindowRgn(WinAPI.GetActiveWindow(), hRgn, true));
}//end updateWindow();

  PS:这种处理方式当图形透明区域特别多的时候,会出现整个处理过程有些卡顿,后期可能要加入线程进行处理。

感谢您的阅读,如果您有好的建议,望不吝赐教!

使用Unity3d做异形窗口的更多相关文章

  1. 一个最简单的Delphi2010的PNG异形窗口方法

    同事演示了一个.NET的的PNG异形窗口.挺漂亮.于是也想用Delphi显摆一个. 关于Delphi用PNG做异形窗口的资料有不少.都是用GDIPlus或者TPNGImage组件加载PNG图像做的.但 ...

  2. [Unity3D]做个小Demo学习Input.touches

    [Unity3D]做个小Demo学习Input.touches 学不如做,下面用一个简单的Demo展示的Input.touches各项字段,有图有真相. 本项目已发布到Github,地址在(https ...

  3. WPF Window异形窗口演示

    我们先通过简单的效果展示,切换展示不同图片: 我们先定义图片资源文件,我们可以在window资源中定义,下面的在app.xaml文件来定义: <Application x:Class=" ...

  4. QT中异形窗口的绘制(winEvent处理WM_NCHITTEST消息)

    这里讨论的只是Windows平台上的实现. 在QT中绘制异形窗口,只要设定 windowFlag 为 CustomizeWindowHint,再结合setMask()就可以做出各种奇形怪状的窗口.相对 ...

  5. Win32创建异形窗口

    大家都见过在windows下各种气泡窗口.输入法窗口以及其他一些窗口,这些窗口看起来不像传统的windows窗那样,上面是标题栏,下面是窗口的客户区.这些窗口形状各异,可以是一个多边形,一幅图,甚至是 ...

  6. [用UpdateLayeredWindow实现任意异形窗口]

    前面提到,我们可以用SetWindowRgn或SetLayeredWindowAttributes实现不规则以及半透明的效果 对于SetWindowRgn,它通过一个Rgn来设置区域,这个Rgn一般可 ...

  7. 用Unity3d做游戏(一)

    准备工作: vs2013,直接从官网下载或者这里 http://pan.baidu.com/s/1bFxC54   unity3d,从官网下载,版本4或者5 https://unity3d.com/c ...

  8. c# UpdateLayeredWindow异形窗口

    #region UpdateLayeredWindow #region 重写窗体的 CreateParams 属性 protected override CreateParams CreatePara ...

  9. 窗口界面编程之一:VB实现简单异形窗口

    一.运行效果图(在Win8里的运行效果,在XP里运行就不能体现出来,因为我使用的XP的界面效果) 二.编译环境:Visual Basic 6.0 (SP6) 三.实现原理:通过区域合并 四.使用API ...

随机推荐

  1. UDP Client—Linux

    #include <stdio.h> #include <netinet/ip.h> int main(int argc,char *argv[]) { #define PER ...

  2. 科蓝软件急招前端开发、PHP、.NET工程师

    职位:前端开发 工作年限:不限     学历要求:大专     招聘人数:2   专业:不限    薪酬:面议 工作地点:浙江嘉兴.北京 岗位职责: 1.负责公司项目的UI设计: 2.负责将UI静态化 ...

  3. Web开发人员必读的12个网站

    The more you actually create, the more you’ll learn.(创造的越多,学习的越多),世界上有无数个开发人员会在网上分享他们的开发经验,我们无法向所有人学 ...

  4. Java8的新特性以及与C#的比较

    函数式接口 VS 委托 在C中,可以使用函数指针来存储函数的入口,从而使得函数可以像变量一样赋值.传递和存储,使得函数的调用变得十分灵活,是实现函数回调的基础.然而函数指针不存在函数的签名信息,甚至可 ...

  5. Java用来进行批量文件重命名,批量提取特定类型文件

    原因: 因为在网上下载视频教程,有的名字特别长,一般都是机构或者网站的宣传,不方便直接看到视频的简介,所以做了下面的第一个功能. 因为老师发的课件中,文件夹太多,想把docx都放在同一个文件夹下面,一 ...

  6. 初识canvas,使用canvas做一个百分比加载进度的动画

    canvas作为H5中重要的新增特性,使开发者可以用它来创作各种令人惊叹的作品.先来看一下浏览器对canvas的支持情况. <canvas> 标签定义图形,比如图表和其他图像,我们使用脚本 ...

  7. NodeJS系列~第三个小例子,NodeJs与Redis实现高并发的队列存储

    返回目录 众所周知 redis量个强大的缓存组件,可以部署在win32和linux环境之上,它有五大存储结构,其中有一种为列表list,它可以实现quene和stack的功能,即队列和堆栈的功能. r ...

  8. 知方可补不足~SQL2008中的发布与订阅模式

    回到目录 作用:完成数据库与数据库的数据同步 原理:源数据库发布需要同时的表,存储过程,或者函数:目标数据库去订阅它,当源发生变化时,目标数据库自己同步,注意,由于这个过程是SQL自动完成的,所以要求 ...

  9. MyBatis学习总结(三)——优化MyBatis配置文件中的配置

    一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中,如下: 1 <?xml version=" ...

  10. Atitit 如何利用先有索引项进行查询性能优化

    Atitit 如何利用先有索引项进行查询性能优化 1.1. 再分析的话就是我们所写的查询条件,其实大部分情况也无非以下几种:1 1.2. 范围查找 动态索引查找1 1.2.1. 索引联合 所谓的索引联 ...