任务栏左下角图标实现方法及排列规范协议

任务栏左下角图标是什么?

这里说的,是在任务栏左下角,紧靠"开始"按钮旁边的图标.

目前采用这种图标的常用软件有:"小Q书桌"、"360软件小助手"、"云端软件"等


实现方法

转自"problc"的文章,http://blog.csdn.net/problc/article/details/7039450
首先用SPY++之类的工具先探测一下这个图标.


Win7:
红色区域:类名是Shell_TrayWnd的容器
黄色区域:类名是ReBarWindow32的二级容器
绿色区域:类名是MSTaskSwWClass的窗口


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替换窗口过程,实现应该不难。


总算x64也搞定了。。
原理一样,CreateRemoteThread->LoadLiibray->DllMain,SetWindowLong GWL_WNDPROC->WM_WINDOWPOSCHANGING.
只不过在x64下,注入程序和dll都要编译成64位程序,才能在explorer.exe里面CreateRemoteThread成功。


耗费了很长时间在x64上
运行结果:


排列规范协议

转自"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

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值