异型窗口是Windows200在窗口中引入的WS_EX_LAYERED风格,并搭配:SetLayeredWindowAttributes API实现的,这里所说的异型窗口不是指椭圆型的窗口或三角型之类的窗口:

这一类的窗口在早期的Windows里就已经规定了的,只需要在创建窗口时修改stsy风格就可以了,这里所说的异型窗口是不规则口,比如一些游戏界面:

类似这种在Windows并没有显示指定的风格界面

WS_EX_LAYERED风格是使窗体支持层次关系并支持透明,而SetLayeredWindowAttributes是设置窗口指定像素点透明!

大致思路就是,在窗口上放置UI图片并让其支持WS_EX_LAYERED风格,然后设置窗口背景色为黑色,在使用SetLayeredWindowAttributes设置窗口黑色像素点为透明色,即可达到这种效果!

这里我已经创建好一个窗口:

此窗口背景为黑色,图像为红色,为什么使用黑色?

答:SetLayeredWindowAttributes使像素透明时一旦不在像素范围内的就不会使其透明化,那怕像素值差1都不行,所以图像轮廓区域会留下一些痕迹锯齿,剔除不明显,所以黑色较暗,不明显!

代码:

//获取窗口句柄HWND hwnd = FindWindow(NULL, "1");//设置风格LONG t = GetWindowLong(hwnd, GWL_EXSTYLE);t |= WS_EX_LAYERED;SetWindowLong(hwnd, GWL_EXSTYLE, t);//设置透明SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), 0, LWA_COLORKEY);

运行效果:

这里边框我保留了下来方便移动,如果觉得碍眼可以增加:WS_POPUP风格去除:

被透明化的颜色会被鼠标穿透,但是没有被透明化的还是支持鼠标消息的!

最后对SetLayeredWindowAttributes函数介绍:

BOOL SetLayeredWindowAttributes(
HWND hwnd, // 指定分层窗口句柄
COLORREF crKey, // 指定需要透明的背景颜色值,可用RGB()宏
BYTE bAlpha, // 设置透明度,0表示完全透明,255表示不透明
DWORD dwFlags // 透明方式
);
其中,dwFlags参数可取以下值:
LWA_ALPHA时:crKey参数无效,bAlpha参数有效;
LWA_COLORKEY:窗体中的所有颜色为crKey的地方将变为透明,bAlpha参数无效。其常量值为1。
LWA_ALPHA | LWA_COLORKEY:crKey的地方将变为全透明,而其它地方根据bAlpha参数确定透明度。

如果想让窗口层次全部透明只需要使用:

LWA_ALPHA

风格即可,让crkey参数失效,则让窗口全部区域透明化,而不以层次关系区分!

Windows核心编程_异型窗口相关推荐

  1. Windows核心编程_异型窗口(续)

    上一篇文章介绍的是使用SetLayeredWindowAttributes API来实现异型窗口,但是很明显效果很差劲,在剔除颜色的过程中凹凸边缘区域的像素点会剔除的非常不明显,在查找信息之后,得出的 ...

  2. Windows核心编程_将窗口嵌入到桌面图标下面不被遮挡 spy 分析过程

    近年很流行动态视频桌面,实则上早期的windows vista系统上有一个Windows DreamScene软件将桌面壁纸设置成视频,但是是收费的! 首先先来观察一下Windows桌面的组成单元: ...

  3. Windows核心编程_让窗口跟随系统样式变化

    当我们使用 VS 编写win32程序时,窗口会有点丑,这个是因为GDI库,Windows有自己的UI库代码,但是版本很多,不同内核版本使用的GUI库不一样,一般vs在编译win32程序时会给你加载一个 ...

  4. Windows核心编程_获取鼠标指定位置的RGB颜色值

    Windows核心编程_获取鼠标指定位置的RGB颜色值 大家平常会见到很多屏幕取色工具,其原理都是获取鼠标位置的屏幕像素点颜色! 一般思路都是:获取鼠标位置,然后取出鼠标指向的屏幕像素点颜色! Get ...

  5. Windows核心编程_设置Windows开机自动登录

    设置自动登录的方法在Windows中已经给出了非常方便的方法,当Windows内核进入登入界面时会检查HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ ...

  6. Windows核心编程_调用控制台窗口

    在我们进行mfc编程和win32窗口编程时,会发现没有控制台窗口其实有时候很无助的,想展示一个数据,要么msg要么debug,但是往往最熟悉的还是那个黑色的窗口 方法: AllocConsole() ...

  7. Windows核心编程_提权

    在Windows下编程有些涉及到硬件或者跨内存的API会发现失效了,原因是因为权限问题,这也是Windows出于安全的保护,但是事物都有两面性的,Windows又为我们提供了提权的API! 1.Adj ...

  8. Windows核心编程_窗口透明组件不透明

    经过前几篇对界面编程的学习,已经对Windows窗口消息有了更加深刻的理解,今天就教大家写一个窗口透明而组件却不透明的小示列! 这个demo并不难,而且还非常的简单,如果你看过我的前几篇针对界面编程写 ...

  9. Windows核心编程_在Visual Studio窗口输出调试信息

    OutputDebugString 该函数会将打印信息输出到VS输出窗口中 注意是输出窗口 但是它只支持一个参数 同时还要OutputDebugStringA和OutputDebugStringW分别 ...

最新文章

  1. CentOS 6.3 运维监控之Cacti 监控主机系统(二)
  2. 滚动视差?CSS 不在话下
  3. gateway sentinel 熔断 不起作用_《一起学sentinel》一
  4. django F和Q 关键字使用
  5. win7 nginx mysql php_windows7配置Nginx+php+mysql的详细教程
  6. 解决C语言程序报错:return type defaults to‘int’
  7. c语言作业帮,少训练大功课C语言
  8. 荣耀正式加入GSMA 成为其企业成员单位
  9. *2.3.2_加入env
  10. 吴恩达机器学习视频教程(含课程作业源代码和学习笔记)
  11. Unity3D研究院之mac上从.ipa中提取unity3D游戏资源
  12. 软件测试面试必问的10个问题
  13. 使用winfrom调用BarTender实现标签的打印
  14. Word生成目录后,前面还有摘要,怎么样让页码从正文第一页开始
  15. 通过EasyPOI导入excel数据
  16. PCL点云滤波器总结
  17. 二叉树层次遍历(借助队列实现)
  18. 数据库表赋权给指定用户
  19. Python 关于引用注意
  20. linux系统怎么共享网络,在Linux操作系统的网络上共享计算机

热门文章

  1. python 服务监控_promethues + python + flask监控后端服务状态
  2. washer和shell有什么区别_disk or washer method?
  3. vue实现搜索框搜索新增_基于Vue el-autocomplete 实现类似百度搜索框功能_含真_前端开发者...
  4. office怎么像wps一样多栏_时常受到欺负怎么办?——要像对付野狗一样对付坏人!...
  5. 《与爱因斯坦月球漫步——美国记忆力冠军教你记忆一切》读书摘抄[美]乔舒亚.福尔
  6. Java:List判空的条件:List=null 和 List.size = 0 当需要对一个LIst进行判空操作时我们可使用如下两个语句:
  7. proj编译linux,在Ubuntu上安装proj 投影转换程序
  8. 大学生计算机大赛课题,第14届中国大学生计算机设计大赛云南赛区决赛举行 32个项目胜出...
  9. python服务器运维书_python自动化运维书
  10. window安装python3后怎么用pyspark_pyspark:连接spark集群Windows环境搭建