WPS2005插件开发二:如何屏蔽WPS菜单栏的功能添加自己的功能?

Word在安装的时候都自带了VBA环境可以将一些自定义的功能代码写在模板中方便的进行控制,但是由于宏代码执行存在一定的安全性问题,不同的客户端设置也不一样这样给宏代码执行可能带来一些影响,所以比较好的方法就是使用插件控制。WPS在安装的时候默认没有带VBA环境,所以写在模板或文件中的宏代码在没有VBA环境的机器上是不会执行的。所以最好的办法就是开发插件。

一.前期准备

首先新建一个DLL工程,引入KSO10.dll,这个是WPS类库文件,和ksaddndr.dll这个是插件接口需要的库文件。引入后就可以根据需要编码了。在wps2005中插件实现的接口是IDTExtensibility2它有5个方法都需要实现,当然可以根据实际情况来决定具体用那些方法。下面就用wps插件方法来实现两个功能:

a)屏蔽wps另存为按钮,执行自己的代码

b)还原用户名功能,就是在打开一个由其他用户编辑的文件后在关闭文件的时候将wps的用户信息还原为原来的用户。

二.IDTExtensibility2事件说明

IDTExtensibility2 库提供了 5 个可用来操纵加载项以及宿主应用程序的事件:OnConnection、OnDisconnection、OnAddInsUpdate、OnStartupComplete 和 OnBeginShutdown。下面简单说明每个事件的含义。

OnConnection 事件

OnConnection 事件在 COM 加载项加载(连接)时发生。可以在OnConnection 事件中实现对WPS的操作,其中使用加载项有以下几种方式:

当应用程序启动时加载;

用户在“COM 加载项”对话框中加载加载项;

在发布的时候,注册表的LoadBehavior键值表示加载行为,通常是3(启动时加载)。如果想让用户在“COM 加载项”对话框中加载加载项的话键值是8。

OnDisconnection 事件

OnDisconnection 事件在卸载 COM 加载项时发生。可以使用 OnDisconnection 事件过程运行能够恢复由加载项对应用程序所作任何更改的代码,或者执行常规清除操作。

卸载加载项和加载行为有对应的几种方式:

用户清除“COM 加载项”对话框中加载项旁边的复选框。

WPS程序关闭时卸载。如果加载项的加载行为设置为“启动”,则WPS 程序再次启动时,就会重新加载加载项。

OnStartupComplete 事件

当WPS程序完成启动例程时,就会发生 OnStartupComplete 事件。事件只在“启动时加载COM加载项”的加载行为下发生。如果此事件确实发生,则它将在 OnConnection 事件之后发生。

可以使用 OnStartupComplete 事件与应用程序交互、且在应用程序完成加载后才应运行的代码。例如,如果要显示一个使用户选择在启动WPS文字程序时选择公文模板的窗体,可以将该代码放到 OnStartupComplete 事件过程中。

OnBeginShutdown 事件

在WPS程序关闭而 COM 加载项仍处于加载状态的情况下,如果WPS程序开始其关闭例程时就会发生 OnBeginShutdown 事件。如果此事件确实发生,它将在 OnDisconnection 事件之前发生。

用户关闭WPS程序时,可以使用 OnBeginShutdown 事件过程运行代码。例如,可以运行将窗体数据保存到某个文件的代码。

OnAddInsUpdate 事件

当一组已加载的 COM 加载项发生更改时,就会发生 OnAddInsUpdate 事件。当某个加载项加载或卸载时,就会在任何其它已加载的加载项中发生 OnAddInsUpdate 事件。例如,如果加载项 A 和 B 当前已加载,然后将加载加载项 C,则 OnAddInsUpdate 事件就会在加载项 A 和 B 中发生。如果 C 已卸载,则加载项 A 和 B 中再次发生 OnAddInsUpdate 事件。

根据这五个事件的触发时机可以组合使用来实现很多有用的功能,大大减小WPS二次开发的难度。

三.具体实现方法:

IDTExtensibility2接口有以下5个方法,方法中具体说明了执行的时间

1.       Implements IDTExtensibility2

2.       Private WithEvents wpsApp As wps.Application 定义一个全局变量存放wps 引用

3.       Private WithEvents wpsDoc As wps.Document  ‘定义个wps文档

4.       Private wpsMenus As KSO.CommandBar      ‘定义个一个工具条

Private WithEvents saveAs As KSO.CommandBarButton ‘定义一个按钮类型

5.       Private username As String ‘存放打开其他文档前的wps用户名

6.       Private Sub IDTExtensibility2_OnAddInsUpdate(custom() As Variant)

‘这个方法在已经注册过的插件修改后重新编译的时候执行

7.       End Sub

8.       Private Sub IDTExtensibility2_OnBeginShutdown(custom() As Variant)

9.       ‘这个方法在开始关闭WPS应用的时候执行,它在方法OnDisconnection的前面执行

10.   End Sub

11.   Private Sub IDTExtensibility2_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)

由于这个方法中有参数APPlication即为WPS应用,对wps应用变量的赋值在这里进行

12.      Set wpsApp = Application

13.   ‘这个方法在打开WPS应用执行

14.   End Sub

15.   Private Sub IDTExtensibility2_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)

16.   ‘这个方法在关闭WPS应用最后执行

17.   End Sub

18.   Private Sub IDTExtensibility2_OnStartupComplete(custom() As Variant)

‘这个方法在完全打开WPS后执行。在OnConnection方法的后面执行

‘ 在这里给所有的全局变量赋值,如果写在OnConnection中是取不到值的,因为wps’’环境还没有初始化好,菜单等都是不存在的。

19.     Set wpsMenus = wpsApp.CommandBars.Item("Menu Bar")

20.     Set wpsFile = wpsMenus.Controls.Item("文件(&F)")

21.     Set saveAs = wpsFile.Controls.Item(6)

username=wpsApp.UserName

22.   End Sub

23.   --------------------------以下部分不是插件接口的主要方法---------------------------

24.    Private Sub saveAs_Click(ByVal Ctrl As KSO.CommandBarButton,    CancelDefault As Boolean)

25.     ‘这个方法在点击wps文件下的另存为按钮时执行

26.       MsgBox "save as"

27.       CancelDefault=True ‘使wps自己的方法不被执行

End Sub

28.   Private Sub wpsApp_DocumentBeforeClose(ByVal Doc As wps.Document, Cancel As Boolean)

29.   On Error GoTo Errs:

30.   wpsApp.UserName=username ‘在关闭文档的时候将用户名恢复为刚开始打开时     候的用户名

31.   ‘这个方法在关闭wps应用的时候执行

32.     Exit Sub

33.   Errs:

34.    MsgBox Err.Description

35.   End Sub

  四.代码说明:

1) saveAs_Click和wpsApp_DocumentBeforeClose方法?在开始使用WithEvents对变量进行修饰所以在VB环境中在上方的列表中选择相应的变量,在右边就可以看到相应的方法了。点击可以自动生成。

Private WithEvents wpsApp As wps.Application 定义一个全局变量存放wps 引用

Private WithEvents wpsDoc As wps.Document  ‘定义个wps文档

Private WithEvents saveAs As KSO.CommandBarButton ‘定义一个按钮类型

2)        Set wpsMenus = wpsApp.CommandBars.Item("Menu Bar")

这句取到WPS的菜单栏,里面包括所有的菜单栏项

        Set wpsFile = wpsMenus.Controls.Item("文件(&F)")

这一句取到文件菜单栏项下面包括所有的下拉项

    Set saveAs = wpsFile.Controls.Item(6)

这一句取到文件菜单项下的第6项,在WPS中为”另存为”,并将这个对象赋值给savaAs变量。这样在单击另存按钮的时候就会调用saveAs_Click()方法

五.注册控件。

将代码编译执行后先生成Dll文件,将下面代码放入记事本,注册文件信息。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER/Software/Kingsoft/Office/WPS/Addins/WPSCom.Test]

"FriendlyName"="Revisionctr"

"Description"="WPS测试插件"

"LoadBehavior"=dword:00000003

"CommandLineSafe"=dword:00000001

其中:FriendlyName是鼠标放在按钮上的提示信息,Description是按钮的显示名称,LoadBehavior加载行为(3表示启动时加载)。WPSCom.Test中WPSCom是工程名,Test是类名。用户将文件保存后,双击导入注册表

在“开始|运行”中输入regsvr32 [组件路径],假设用户的DLL组件放在d:/ WPSCOm.dll,注册组件的命令应写为: regsvr32 d:/ WPSCOm.dll 点击确定后,提示注册成功。

七.测试

注册成功后在wps工具àcom加载项中可以看到,在上述例子中点击文件下的另存为会弹出自己写的对话框。屏蔽了wps本身的功能。

wps2005插件开发之旅相关推荐

  1. 取代 Ant:使用 Maven 管理 Wowza 插件开发

    Wowza 官方提供的 Eclipse 插件使用的是 Ant 作为项目管理工具(参考< Eclipse 安装/更新 Wowza IDE 插件的步骤>),如下图所示:         bui ...

  2. 西安天气html5插件,Chrome 插件开发——本地天气

    经常在Chrome应用商店下载扩展程序也就是插件,有时候在想可不可以自己也开发一个插件用用呢?本文就是在这样的背景下产生的,以一个生活必需的简单获取天气的插件作为开发演示,下面就开始我们的Chrome ...

  3. 使用 CocoaPods 给微信集成 SDK 打印收发消息

    推荐序 本文介绍的是一套逆向工具,可以在非越狱手机上给任意应用增加插件.在文末的示例中,作者拿微信举例,展示出在微信中打印收发消息的功能. 这套工具可以加快逆向开发的速度,其重签名思想也可以用于二次分 ...

  4. jenkins 安装插件失败_Jenkins 自动化安装插件

    手工安装 Jenkins 插件的方法 通常,我们有两种方法安装 Jenkins 插件.第一种方法是到 Jenkins 插件管理页面搜索插件,然后安装.第二种方法是上传 Jenkins 插件的 hpi ...

  5. 使用CocoaPods给微信集成SDK打印收发消息

    推荐序 本文介绍的是一套逆向工具,可以在非越狱手机上给任意应用增加插件.在文末的示例中,作者拿微信举例,展示出在微信中打印收发消息的功能. 这套工具可以加快逆向开发的速度,其重签名思想也可以用于二次分 ...

  6. firefox 扩展

    firefox 扩展 <table border="0" cellpadding="4"> <tbody><tr> < ...

  7. 开发一个 Chrome 浏览器插件,拢共分几步?

    市面上浏览器有很多,比如 IE.Edge.火狐.Safari 等,但市场占有率第一的永远只有一个 -- Chrome. 之所以如此,很大一部分原因是 Chrome 丰富的插件库.我们在使用浏览器时,免 ...

  8. 开发一个看电影资讯的VSCode插件

    前言 VSCode这款开发工具相信大家是非常熟悉的了,那么VSCode仅仅是一款代码编辑工具吗?非也,在VSCode上有非常多的工(mo)作(yu)的插件,比如看股票呀,玩玩小游戏呀,看看小说呀,听听 ...

  9. 30分钟开发一款抓取网站图片资源的浏览器插件

    前言 由于业务需求, 笔者要为公司开发几款实用的浏览器插件,所以大致花了一天的时间,看完了谷歌浏览器插件开发文档,在这里特地总结一下经验, 并通过一个实际案例来复盘插件开发的流程和注意事项. 你将收获 ...

  10. flutter插件开发学习之旅(4)-------检测GPS状态,打开GPS和显示经纬度实战

    检测GPS状态,打开GPS和显示经纬度实战 前言 准备工具 实战开始 前言 经过上一篇的学习,大家学习到蓝牙的实战,这节课我们给大家分享Flutter调用原生API实现检测手机GPS状态和打开GPS; ...

最新文章

  1. 手把手 | 教你爬下100部电影数据:R语言网页爬取入门指南
  2. 人脸关键点估计人头姿态
  3. springcloud Feign工程熔断器Hystrix
  4. ElementUI + express实现头像上传及后台图片保存
  5. 如何使用Alfred mac版的Snippets文字扩展功能
  6. 《WF编程》系列之29 - 本地通信事件:HandleExternalEventActivity 活动生成器
  7. 如何避免内存泄漏?(C++)
  8. 系统修复专家—SREng
  9. 408复习策略(强化阶段)
  10. stm32实现心电监测-原理图单片机程序C#上位机程序
  11. 怎样用计算机给ipd传电影,怎样不使用iTunes将电影导入iPad?
  12. 中文期刊模板的页面格式,以《电力系统自动化》为例
  13. MongoDB Tailable Cursors
  14. jQueryXML笔记
  15. OSChina App代码分析二
  16. Linux云计算架构-docker容器命名和资源配额控制(2)
  17. java 霍思_心术结局是什么
  18. 对list集合重新排序
  19. 解决虚拟机安装系统报错解决方法
  20. Android屏幕尺寸适配常见方案smallestWidth

热门文章

  1. php优缺点ppt,ppt和pdf有什么区别
  2. 谐波平衡 matlab,解非线性振动问题的摄动谐波平衡法
  3. AD 画板知识 mil和mm换算(硬件每日一题)
  4. Xshell4、Xftp4注册码
  5. 51单片机前言知识总结
  6. DirectX9初步
  7. webmax函数高级教程整理集2
  8. 微信小程序超级占内存_可能没有想象的那么美好——微信小程序存储占用与清理实测...
  9. 画法几何与土木水利工程制图2020年期末考题思路
  10. Adobe CS3教程安装问题