易语言资源网 - 做最全的易语言资源下载社区
【精易招聘】UniApp开发工程师 精易论坛授权登录

真正的最高Z序,比WS_EX_TOPMOST更顶层   [复制链接]

    2022-05-12 10:31:55
    高级教程源码
    易语言资源网
    230 次浏览
    来源链接


当你想制作一个屏幕截图工具或者窗口标记工具时,为了在屏幕上标记某个形状,有几种可行方案:

* 获取当前屏幕的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次启动):



点我下载 (已有 10 次下载)

引用模块


源码文件名 模块文件名
demo.e
UIAccess.ec


引用支持库


源码文件名 支持库文件名 支持库标识
demo.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
uiaccess.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325


[错误报告]   上一篇:【动画框】画工具条,支持透明背景,图片背...     下一篇:超大文本对比去重, 百万行15秒...