脚本开发,脚本学习,辅助软件,各种工具软件

访问密码统一为:3158

查看: 588|回复: 0

创建Windows任务栏窗口缩略图按钮教程+源码

[复制链接]

57

主题

57

帖子

303

积分

孩提

Rank: 2

积分
303
发表于 2020-5-17 11:46:36 | 显示全部楼层 |阅读模式

效果图:音乐播放控制按钮

教程开始:



实现方法在微软的帮助文档中,我发不了链接(百度关键词 任务栏扩展 MSDN)

         文档中提供了3三个API:ThumbBarAddButtons(创建按钮)、 ThumbBarSetImageList、 ThumbBarUpdateButtons(更新按钮)

这三个API在动态链接库Explorerframe.dll中,我尝试过直接调用它们,结果却不存在。

        不过MSDN中提供了C++的调用方法,在C++中这三个API被封装在ITaskBarList3类中,ITaskBarList3类定义在“Shobjidl.h”头文件

所以我想想到个方法,利用微软提供的C++代码编写一个DLL库来实现这三个方法,让易语言程序调用。

接下来我编写了TaskBarEx.dll这个链接库(C++源码在最下面),里面提供了AddThumbarButtons这个方法,方法易语言定义如下:

[url=]复制代码[/url]

  • .版本 2
  • .DLL命令 AddThumbarButtons, 整数型, "TaskBarEx", "_AddThumbarButtons@12", 公开
  •     .参数 句柄, 整数型
  •     .参数 sum, 整数型
  •     .参数 pTHUMBBUTTON, THUMBBUTTON, 数组

这个链接库的代码都是MSDN中现成的,从微软的帮助文档复制过来,稍加修改就行了。

  


你们以为这样就结束了!


        当我在易语言中声明此API调用后,才发现并没有什么卵用,我也不知道为什么。后面才知道微软提供的这三个API是用COM对象的方式调用的。于是我在论坛中找了一大堆关于如何调用COM对象的教程,完全看不懂!


当然!什么事情都是有解决的办法的,最终我还是找到办法了,以下方法是我乱搞搞出来的。


我在易语言中创建了一个“对象”类型的变量(用来调用COM对象的)取名: ITAskBarList3  并创建了ITAskBarList3类的COM对象

[url=]复制代码[/url]

  • ITAskBarList3.创建 (“{56FDF344-FD6D-11d0-958A-006097C9A090}”, )

代码中那一串文本是COM对象的唯一标识符,我在VS2017中ITAskBarList3类的声明中找得到。定义在“Shobjidl.h”头文件中。


然后声明了一个THUMBBUTTON结构(见MSDN),定义按钮的信息:

[url=]复制代码[/url]

  • .版本 2
  • ' 按钮1
  • Button.hIcon = LoadIconA (mHwnd, 112)  ' 112为“上一首按钮”的图标在TaskBarEx.dll链接库的资源编号
  • Button.dwMask = 位或 (2, 4, 8)  ' 表示你准备使用THUMBBUTTON结构中的哪些成员
  • Button.iId = 0  ' 按钮的编号,用于在窗口的消息循环中的WM_COMMAND消息下判断是哪个按钮
  • Button.dwFlags = 0  ' 表示按钮状态,可用还是禁用,0表示可用
  • wtext = Ansi转Unicode (“上一首”)  ' 按钮提示文本需要Unicode类型
  • toBytes (Button.szTip, wtext, 取字节集长度 (wtext))
  • 加入成员 (sButton, Button)  ' 声明好一个按钮结构就加sButton数组

最后调用TaskBarEx.dll中我提供的AddThumbarButtons函数

[url=]复制代码[/url]

  • AddThumbarButtons (窗口句柄, 1, sButton)

以上就是创建一个缩略图按钮的基本代码。下面还有一些问题:

以下是MSDN的原话:

  


注意   当应用程序显示窗口时,系统会创建其任务栏按钮。当按钮就位时,任务栏会向窗口发送TaskbarButtonCreated消息。它的值通过调用RegisterWindowMessage(L(“TaskbarButtonCreated”))计算。该消息必须在应用程序调用任何ITaskbarList3方法之前接收。


       意思就是创建按钮的所有代码都在TaskbarButtonCreated消息之后,并且这个消息值需要我们调用API自己注册。我做过测试,发现要想在窗口创建完成后创建按钮,就必须这样做;如果将创建按钮代码放在 __按钮__被按下事件 下就不一定,不知道为什么。


教程结束

  


当然还有一些细节问题需要处理,在我的源码中都有注释,可以看看。如果代码看不懂可以问我,不过关于COM对象的问题我也不懂。


TaskBarEx.dll的源代码:整个VC++工程目录100多MB,无语了,如果需要我后面再发;下面两个主要函数代码,其实MSDN都有。

我用的是VS2017

EXTERN_C __declspec(dllexport)   int _stdcall eGetStart(){        return 0;}EXTERN_C __declspec(dllexport)   int _stdcall AddThumbarButtons(HWND hwnd,int sum, THUMBBUTTON thbButtons1[]){ //创建一个ITaskbarList3的实例 ITaskbarList3* ptbl; HRESULT back = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&ptbl)); if (SUCCEEDED(back)) {   back = ptbl->ThumbBarAddButtons(hwnd, sum, thbButtons1);   ptbl->Release(); } return back;};下载链接:https://t00y.com/file/20110282-443786688




上一篇:Ex界面模仿手机游戏--猜心术
下一篇:BASS库模块,支持读取ID3v2.3源码
3Q4T网,编程学习交流基地。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表