• 6680阅读
  • 11回复

[提问]误打误撞实现了Win7中任务栏进度条的效果,不过还有些问题需要请教 [复制链接]

上一主题 下一主题
离线roywillow
 

只看楼主 倒序阅读 楼主  发表于: 2012-08-20
因为某个帖子问到了这个问题,正好我也感兴趣,于是就去尝试了一下,然后误打误撞实现了
如下是我的代码
TaskbarProgressBar.rar (3 K) 下载次数:48
其中那个QTimer::singleShot()在这段代码中是必须的,因为进度条效果只有在任务栏按钮已经创建了之后才有效果
我大概只能说,我实现了这个效果,但是不能说我的代码是正确/最简单的
至少目前有这么一个疑问:COM接口究竟该怎么调用?我对COM几乎是一片空白啊跪……
QAxObject之类的创建的时候似乎都是针对某个特定的COM Object的,而像任务栏进度条的实现,是直接调用一些interface。我感觉是运气比较好,找到了这个需要的interface实现的object,并且interface的定义也google到了(shobjidl.h是Windows SDK中的头文件,且这个效果依赖于最新的Win7SDK中的shobjidl.h,而我的mingw提供的这个h尚不包括ITaskBarList3的声明,需要自己找)。
但是如果运气(或者说水平?)不够好,找不到该从哪个object进行query interface该怎么办?如果我没有需要的interface的声明该怎么办?
最后具体出效果的部分其实并没有用到Qt的东西,那么我是不是可以完完全全只用系统api来实现,包括接口的获得?


11楼更新了一下,没依赖QAxObject
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线呆呆很呆
只看该作者 1楼 发表于: 2012-08-20
shobjidl_7.h 没有换行。。。怎么看啊
离线roywillow

只看该作者 2楼 发表于: 2012-08-20
回 1楼(呆呆很呆) 的帖子
那个头文件是我从网上搜索到的……具体我也没看
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线mewjerry
只看该作者 3楼 发表于: 2012-08-20
介个不错,其实Win 7的shell当中还有很多类似接口吧,比如任务栏右键菜单之类的、缩略图生成之类的
离线ffii4455

只看该作者 4楼 发表于: 2012-08-20
其实QtCreator本身就有这个功能。。。
离线roywillow

只看该作者 5楼 发表于: 2012-08-20
回 4楼(ffii4455) 的帖子
确实是……
不过看那代码……该怎么找呢
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线ffii4455

只看该作者 6楼 发表于: 2012-08-20
回 5楼(roywillow) 的帖子
我也是找了一个下午的接口没有成功。
甚至已经用到了VC中常用的
CoInitialize(0);
CoCreateInstance();
最后就是缺了个定义所以没有成功。
却忘了Qt自身带的用来访问com的QAxObject....
真是高手啊,佩服~
离线roywillow

只看该作者 7楼 发表于: 2012-08-20
回 6楼(ffii4455) 的帖子
不过QAxObject直接调用接口就目前我这边来看感觉很是恶心啊……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线roywillow

只看该作者 8楼 发表于: 2012-08-20
QtCreator中的实现似乎还真让我撞出来了……
在\src\plugins\coreplugin\progressmanager\progressmanager_win.cpp中提到了ITaskbarList3

但是另一方面,这个实现完全依赖Win7 SDK,而我这里mingw提供的头文件没包含ITaskbarList3,所以最后我编译出来的creator好像没这功能
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线rcyboom

只看该作者 9楼 发表于: 2012-08-20
说实话这个和qt甚至c++没有任何关系,你需要的只是win7 sdk然后用你的方式去调用它,msdn已经给出了完整的c++实现的例子:
http://code.msdn.microsoft.com/CppWin7TaskbarProgressBar-b8c3c56a/sourcecode?fileId=21598&pathId=1671681611
离线roywillow

只看该作者 10楼 发表于: 2012-08-20
回 9楼(rcyboom) 的帖子
确实看了creator的代码后发现与qt没啥关系,我的实现果然太浪费了
但是因为用的是mingw,headers的版本又比较旧,又不想装win7 sdk,所以至少ITaskbarList3的声明是没有的,直接按照creator或者微软的例子来实现肯定不通

现在更新了工具链的版本,似乎包括了win7 sdk的内容
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线roywillow

只看该作者 11楼 发表于: 2012-08-21
回 6楼(ffii4455) 的帖子
没有用QAxObject又实现了一个,几乎是直接挪用的creator中的代码
TaskbarProgressBar.rar (2 K) 下载次数:28
如果用mingw编译的话需要比较新的headers和libs
另外不知道为啥如果直接用shobjidl.h定义的IID_ITaskbarList3时,在链接的时候会出现undefined reference to _IID_ITaskbarList3,明明我用的是IID_ITaskbarList3而不是_IID_ITaskbarList3啊……
所以只好将IID_ITaskbarList3定义成了宏,用QUuid来代为生成
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
快速回复
限100 字节
 
上一个 下一个