【搬运】真正的最高Z序,比WS_EX_TOPMOST更顶层
当你想制作一个屏幕截图工具或者窗口标记工具时,为了在屏幕上标记某个形状,有几种可行方案:
* 获取当前屏幕的HDC,直接绘制你的图形
* 创建一个无边框窗口,然后在窗口上面绘制
然而第一种方案对于动态变化的窗口适应性不太好,容易产生残影,另外还需要考虑DPI缩放,比较复杂。第二种在以前版本的Windows下没问题,但从Windows8以后,就需要面对新的情况:窗口拿不到最高Z序。
下面的动图演示了“总在最前”属性的窗口的真实情况:易语言学习源码
可见,普通的应用无论是否使用总在最前属性(或WS_EX_TOPMOST),窗口的Z序总低于一些特定的程序。
可以在这篇文章中找到一些解释
简单的说,微软从Windows8开始,引入了其他窗口段,这导致了你窗口的Z序始终低于设置过其他ZBID段的窗口。
要让你的窗口Z序最前,除了文中提到的CreateWindowInBand/SetWindowBand外(调用成功的条件过于苛刻),还有一个方法,就是启用UIAccess。启用UIAccess后,设置窗口总在最前,即可让你的窗口位于最高Z序:ZBID_UIACCESS。易语言学习源码
根据微软的文档,要使用UIAccess也需要很多条件,参见这里
此模块则使用不那么正规的方法,尝试获取UIAccess权限。为了达成这一目的,程序需要管理员权限,不过这比官方提到的条件更宽松。
关于C版本的源码和具体实现的说明,可以前往github
下面是用模块启用UIAccess后的效果:易语言学习源码
注意:UIAccess权限理论上不是用来达成这个目的的,所以不要滥用这个权限。如果可能,最好把使用UIAccess的功能独立出来做成可执行文件。
易语言版本的代码和例子(正常情况下进程会有3次启动):
(已有9次下载)本站发布的文章及教程仅限用于学习和研究目的.请勿用于商业或违法用途,否则后果请用户自负。