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

时间:2021-06-12 06:58:02
【文件属性】:
文件名称:创建Windows任务栏窗口缩略图按钮教程+源码-易语言
文件大小:4.43MB
文件格式:ZIP
更新时间:2021-06-12 06:58:02
系统工具源码 效果图:音乐播放控制按钮 教程开始: 实现方法在微软的帮助文档中,我发不了链接(百度关键词 任务栏扩展 MSDN) 文档中提供了3三个API:ThumbBarAddButtons(创建按钮)、 ThumbBarSetImageList、 ThumbBarUpdateButtons(更新按钮) 这三个API在动态链接库 Explorerframe.dll 中,我尝试过直接调用它们,结果却不存在。 不过MSDN中提供了C++的调用方法,在C++中这三个API被封装在 ITaskBarList3 类中,ITaskBarList3类定义在“ Shobjidl.h ”头文件 所以我想想到个方法,利用微软提供的C++代码编写一个DLL库来实现这三个方法,让易语言程序调用。 接下来我编写了 TaskBarEx.dll 这个链接库(C++源码在最下面),里面提供了 AddThumbarButtons 这个方法,方法易语言定义如下: 复制代码 .版本 2 .DLL命令 AddThumbarButtons, 整数型, "TaskBarEx", "_AddThumbarButtons@12", 公开 .参数 句柄, 整数型 .参数 sum, 整数型 .参数 pTHUMBBUTTON, THUMBBUTTON, 数组 这个链接库的代码都是MSDN中现成的,从微软的帮助文档复制过来,稍加修改就行了。 你们以为这样就结束了! 当我在易语言中声明此API调用后,才发现并没有什么卵用,我也不知道为什么。后面才知道微软提供的这三个API是用COM对象的方式调用的。于是 我在论坛中找了一大堆关于如何调用COM对象的教程,完全看不懂! 当然!什么事情都是有解决的办法的,最终我还是找到办法了,以下方法是我乱搞搞出来的。 我在易语言中创建了一个“对象”类型的变量(用来调用COM对象的)取名: ITAskBarList3并创建了 ITAskBarList3类的COM对象 复制代码 ITAskBarList3.创建 (“{56FDF344-FD6D-11d0-958A-006097C9A090}”, ) 代码中那一串文本是COM对象的唯一标识符,我在VS2017中 ITAskBarList3类的声明中找得到。定义在“ Shobjidl.h ”头文件中。 然后声明了一个THUMBBUTTON 结构(见MSDN),定义按钮的信息: 复制代码 .版本 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函数 复制代码 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 eG
【文件预览】:
dllmain.obj
stdafx.cpp
icon2.ico
CL.write.1.tlog
CL.read.1.tlog
Win32Project1.vcxproj
rc.write.1.tlog
stdafx.h
stdafx.obj
Win32Project1.sln
icon1.ico
Win32Project1.lastbuildstate
rc.read.1.tlog
icon3.ico
CL.command.1.tlog
Win32Project1.cpp
dllmain.cpp
targetver.h
Win32Project11.rc
Win32Project1.write.1u.tlog
Win32Project11.res
bitmap2.bmp
link.write.1.tlog
Win32Project11.aps
Win32Project1.vcxproj.filters
resource.h
link.command.1.tlog
Win32Project1.obj
Image.png
rc.command.1.tlog
link.read.1.tlog
vc141.idb
Win32Project1.aps
Win32Project1.pch
resource1.h
bitmap1.bmp
vc141.pdb
Win32Project1.vcxproj.user
Win32Project1.rc
ReadMe.txt
Win32Project1.log

网友评论