之前无意中看见一篇文章:Windows 10中的窗体Z序
讲到,在win8以上,窗口分Z序段了。一般情况下,我们创建的窗口,不管是普通的,还是TopMost的,都盖不过勾选“置顶”的任务管理器。而任务管理器则盖不过放大镜。它们在不同的Z序段中。
极域、机房管理助手的段都是一般窗口,只不过是定时调用了SetWindowPos()
设置成TopMost而已。于是我想,如果要实现超级置顶,只用调整窗口的Z序段即可。上面文章中给的办法是,CreateWindowInBand()
和SetWindowBand()
,这两个在C/C++头文件里是没有的,要用到GetProcAddress()
。但是直接调用它们设置我们喜欢的Z序段,会调用失败,拒绝访问。
绕过方法也很多:
- 把dll注入到系统进程hook住关键函数(即上面文章提供的绕过法)
- 遍历进程获取UIAccess令牌
- ……
老实的绕过法,就是在manifest清单里加入如下语段: