任务栏左下角图标是什么?
这里说的,是在任务栏左下角,紧靠"开始"按钮旁边的图标.
目前采用这种图标的常用软件有:"小Q书桌"、"360软件小助手"、"云端软件"等
![](http://img.e-com-net.com/image/info5/79ae7495284d483da9416b70d19d8971.jpg)
实现方法
转自"problc"的文章,http://blog.csdn.net/problc/article/details/7039450
首先用SPY++之类的工具先探测一下这个图标.
![任务栏左下角图标实现方法及排列规范协议_第1张图片](http://img.e-com-net.com/image/info5/3b259de746a141d18b523e8b5174083c.jpg)
![](http://img.e-com-net.com/image/info5/a4ee3fc809b346eca4a12b0e05859e29.jpg)
Win7:
红色区域:类名是Shell_TrayWnd的容器
黄色区域:类名是ReBarWindow32的二级容器
绿色区域:类名是MSTaskSwWClass的窗口
![](http://img.e-com-net.com/image/info5/48dda8e768ce4a93b75848ef27523050.jpg)
WinXP:
红色区域:红色区域——类名是Shell_TrayWnd的容器
黄色区域:类名是ReBarWindow32的二级容器
绿色区域:快速启动区域
紫色窗口:类名是MSTaskSwWClass的窗口
分析结果
从spy++看,小Q书桌的窗口跟Shell_TrayWnd根本没有任何关系,不是Shell_TrayWnd的子窗口。
所以小Q书桌可能不是用的Shell扩展的方式加到任务栏的。
因为不属于ReBar,所以小Q也是不能拖动位置排序的。他不是一个快捷方式拖到任务栏。
他是一个独立的窗口。
用MoveWindow的方式实现的话,效果就是第一个图。但是这个状态不稳定,任务栏刷新就会变成第二个图,Chrome被自己的窗口遮盖了。小Q书桌就没有刷新问题。
难道要Hook ReBar的WM_POSCHANGING吗?
有没有简单一点的实现方式呢。
-----------------------------------------------------------------------------------------
用timer实现的话,不太稳定
没想到这个问题会非常的复杂,跨进程SetWindowLong或者HOOKWM_POSCHANGING非常麻烦。反汇编QDesk,里面有CreateRemoteThread,很可能跟这个有关。ollydbg用得不熟,否则可以断点看下是不是在Explorer.exe里面创建的线程。但是x64下,CreateRemoteThread没找到办法Inject到64位的explorer.exe。QDesk里面还有个dr.dll,不知道里面是不是有个驱动,在Ring0是不是干了点什么,反正x64这个问题,我是搞不定了。
在32位系统里,CreateRemoteThread,注入一个线程到explorer.exe,然后在线程里SetWindowLong替换窗口过程,实现应该不难。
![任务栏左下角图标实现方法及排列规范协议_第2张图片](http://img.e-com-net.com/image/info5/7f79a3a88391494dbf3ebb15f1f88dca.jpg)
总算x64也搞定了。。
原理一样,CreateRemoteThread->LoadLiibray->DllMain,SetWindowLong GWL_WNDPROC->WM_WINDOWPOSCHANGING.
只不过在x64下,注入程序和dll都要编译成64位程序,才能在explorer.exe里面CreateRemoteThread成功。
![任务栏左下角图标实现方法及排列规范协议_第3张图片](http://img.e-com-net.com/image/info5/2d60dfca35c24b9ea66581b95b38f6ef.png)
耗费了很长时间在x64上
运行结果:
![](http://img.e-com-net.com/image/info5/e2da97f84dbd4fbab805d59ed2117a34.jpg)
排列规范协议
转自"nddgwml"的文章:http://bbs.kafan.cn/thread-1141287-1-1.html
(一)
桌面左下角是Windows 开始菜单,一直以来,Windows没有直接提供任务栏左下角停靠的API接口,右下角的倒是有。 从Window3.1以来,开始菜单的大体风格都差不多。而对于希望寻求更新鲜操作体验的用户来说,有没有其他的软件可以选择呢 ?
目前已知的左下角工具有: 云端软件平台、小Q书桌、360软件小助手
小Q书桌出品时为了兼容云端软件,做了一些特殊的兼容逻辑。可以和云端软件并存。
后继,360也出了软件小助手, 没有进行兼容逻辑。当360的软件小助手遇见云端软件,云端软件图标直接覆盖,无法使用。
当360的软件小助手遇见小Q书桌,小Q书桌图标被直接覆盖,无法使用。
一时间用户怨声载道,桌面左下角的局势剑拔弩张。
(二)
为了使各图标排列前后有序,不会造成用户的困扰, 不拿用户的机器当作战场, 小Q书桌、云端及360多次函件往来讨论沟通,三方产品团队终于于10月31日对软件兼容问题达成了共识。
协议总的原则来说,就是先来后到的问题。谁先在用户机器上安装上,谁的图标就贴近开始菜单,后续安装的同类软件依次排序。这是小Q书桌、云端和360公司三方努力达成的共识,是一个在自律的基础上形成的一个公约。维护行业的健康有序发展,是软件产商共同的责任。
这个协议约定的确立, 是国内软件厂商在软件面临冲突的时候,首次进行的文明合作,也是推动业界公平公正,和谐共存风气形成的一个有示范意义公约。
三家公司承诺加强自律,遵守已经确立的三方协议,共同维护行业秩序。欢迎各界和用户一起监督三家公司是否能良好遵守。
也希望该协议可以给未来需要左下角图标的软件能有矩可循,欢迎其他厂商的加入,让桌面左下角这块小天地变得繁荣兴盛,为用户提供更多更优质的服务。
(三)
技术上保证这一顺序队列呢?因为windows本身没有提供这样的停靠API,自然也没有提供有效排序依据,所以需要三方联合制定一套系统注册规则来保证。在三方的技术团队通力合作下,参照windows下很多系统API的调用规则,设立如下规则:
在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\下建立一个项:StartButtonDock,然后顺次注册子项来记录安装先后。
各产品按照程序安装的顺序从前到后创建子键,子键名称采用阿拉伯数字(如1,2,3)排序。
子键内建立key,写入左下角停靠的窗体类名或当前的句柄,以便于后面的窗体停靠。特别注意:窗体类名或当前的句柄信息要准确有效。
大体的技术思路就是这样:
1、安装过程:
1)StartButtonDock下写入自己的顺序子键
2)写入自己的窗体类名
2、运行过程(开始自动运行或用户点击启动等)
1) 从StartButtonDock下面数一数自己是第几个
2) 找到离自己前面一个有效窗体( FindWindow 或直接从注册表里读取到窗体句柄),然后停靠在它后面。如果一个都没找到,停靠在开始菜单后面。当然,可以在注册表里写一下自己的句柄值。
3)定时扫描看是否有排在自己前面的窗体被激活了。如果有的话,主动挪位置给它。
3、卸载过程:
1)清理掉自己在StartButtonDock下面建立的键值。
其中有几个需要注意或者释疑的地方:
①协议中为什么有写Handle(句柄)和类名两种方式?
因为win7下不同权限进程间无法通讯,无法通过Findwindow找到,所以不得已的情况下,用句柄直接写入。
② 协议中使用定时器扫描排序在自己前面的窗体是否有效率问题?
是有这样的顾虑,我们协议扩展中提供了SendMessage的消息机制来解决可能未来会遇到的效率问题。但是目前情况下,对软件效率影响不大。
云端、小Q书桌和360软件小助手都已经分别发布了兼容协议版本,希望大家都能在兼容协议的规范下和谐共处,越做越好。
如果对规则细节还不太明白的,具体技术细节可以参照附件中的文档:《任务栏左下角图标排列规范协议》
附件下载地址: http://dl_dir2.qq.com/invc/qqpcmgr/other/deal.pdf