读取其它进程进度条的进度并显示在任务栏图标上
从Win7开始,任务栏图标可以用来显示进度了。但是仍然有很多需要显示进度的程序并没有将这一功能用起来,其中甚至包括Windows自身的蓝牙传输。我想写一个程序,它拥有一个任务栏图标,它可以读取其它程序窗口中的进度条,并将进度显示在自己的任务栏图标上。要实现一个这样的程序,有三个问题需要解决:
(1) 如何获取想要监视的进度条的句柄;
(2) 如何获取进度条的进度;
(3) 如何在任务栏图标上显示进度。
对于第一个问题,我觉得自己写稍微有些麻烦,实际上可以借助现成的工具,比如Visual Studio自带的Spy++。但是Visual Studio是一个昂贵而庞大的开发环境,不是每个人都有。AutoIt自带的Window Info是一个不错的选择,而且当过管理员管理过几台电脑的人都会用两下子AutoIt吧,毕竟安装软件什么的苦活累活一般都交给AutoIt这样的自动化软件来做了。
对于第二个问题,我查了一下,利用SendMessage给进度条发PBM类的消息即可。其中要用到的两个分别为:
PBM_GETRANGE:获取进度条的范围
PBM_GETPOS:获取进度
对于第三个问题,Vista以来提供的一系列新的API都是以接口的方式出现的。这让我想起来很久以前看过的一本书,提到Win32API的一个问题是平面化的API,没有组织和结构,以后的Windows API可能会以接口的方式出现。没想到书中的这一预言真的应验了。由于需要直接操纵接口,很多ActiveX/COM库都没法用了。好在comtypes提供了非常底层的机制,我们可以自己定义接口,继承IUnknown,调用IDispatch等等。
解决了三个问题,程序也就写出来了,源码参见https://github.com/xialulee/WaveSyn/blob/master/wavesynlib/interfaces/windows/progressbarreader.py。现在试验一下效果。我们用蓝牙往电脑上传一个文件:
用AutoIt Window Info探测进度条的句柄:
以进度条的句柄为参数启动progressbarreader.py:
progressbarreader.py 0x21DF2
启动的Python程序的任务栏图标就会显示蓝牙传输的进度。这是我们可以把蓝牙传输窗口最小化,然后干别的事情,在这种情况下依然能够通过Python的任务栏图标随时掌握蓝牙传输的进度。
最初发布于:2015年10月23日,http://blog.sina.com.cn/xialulee