现在的位置: 首页 > 综合 > 正文

谈如何捕获OFFICE软件的事件

2018年02月08日 ⁄ 综合 ⁄ 共 2177字 ⁄ 字号 评论关闭

关键词WORD PPT 事件 VC                                           

 

  作者:wallimn(wallimn@sohu.comhttp://wallimn.bokee.com)欢迎转载,转载请保留作者信息。
  今天很高兴,终于学会捕获Microsoft Office PowerPoint的事件。写出来给大家分享。我发现网上原创的文章少,转载的文章多,我来为原创做点贡献。
  本文以PPT为例,其原理应该适用于WORD及EXCEL,假定读者有些使用ATL开发OFFICE插件(或COM)的基础。所谓事件,在PPT中是指SlideShowBegin(播放开始)、SlideShowEnd(播放结束)等,所有事件的名字和含义可以PPT的VBA帮助章节找到。
  作者的测试环境为VC6.0,使用ATL框架。测试的基础软件框架使用的是徐景周(很感谢这位高人,代码及文章给了我很大的帮助)的《PowerPoint2K/XP插件开发》中的源码,相关源码及文章可以到www.vckbase.com上找到。插件开发的相关细节这里就略过了。
  其实技术就是一层纸,非常的简单,在此我也不打算详细的说,把几个要点说一下。其实是仔细分析了自定义按钮单击事件的代码后,经过一上午的测试实现了PPT播放事件的捕获。主要就是在几个地方加入些代码。
1.使插件类继承public IDispEventSimpleImpl<11/*自定的不重复正数*/, CPowerPoint2000Addin, &__uuidof(MSPPT::EApplication)>
 定义一个转义:typedef IDispEventSimpleImpl</*nID =*/ 11,CPowerPoint2000Addin, &__uuidof(MSPPT::EApplication)> PPTEvents;
2.声明一个结构,标识响应函数信息(第一个必须为CC_STDCALL,后面是返回值,参数个数及类型)
_ATL_FUNC_INFO OnPPTEventInfo = {CC_STDCALL,VT_EMPTY,1,{VT_DISPATCH}};
3.增加事件映射
 BEGIN_SINK_MAP(CPowerPoint2000Addin)
  //SINK_ENTRY_INFO(1,__uuidof(Office::_CommandBarButtonEvents),/*dispid*/ 0x01,OnClickButton1, &OnClickButtonInfo)
  SINK_ENTRY_INFO(11,__uuidof(MSPPT::EApplication),/*dispid*/ 2011,SlideShowBegin, &OnPPTEventInfo)//2011,DISPID,可以在MSDN上查到
 END_SINK_MAP()
其它DISPID
2001 WindowSelectionChange  
2002 WindowBeforeRightClick  
2003 WindowBeforeDoubleClick  
2004 PresentationClose  
2005 PresentationSave  
2006 PresentationOpen  
2007 NewPresentation  
2008 PresentationNewSlide  
2009 WindowActivate  
2010 WindowDeactivate  
2011 SlideShowBegin  
2012 SlideShowNextBuild  
2013 SlideShowNextSlide  
2014 SlideShowEnd  
2015 PresentationPrint  
2016 SlideSelectionChanged x
2017 ColorSchemeChanged x
2018 PresentationBeforeSave x
2019 SlideShowNextClick x

4.声明事件
    void __stdcall SlideShowBegin (IDispatch * /*struct SlideShowWindow * */ Wn );
  实现事件
  void __stdcall CPowerPoint2000Addin::SlideShowBegin (IDispatch * /*struct SlideShowWindow * */ Wn )
{
 MessageBox(NULL, "SlideShowBegin", "SlideShowBegin" , MB_OK);
// return S_OK;
}
5.激活新增的事件连接点
  hr = PPTEvents::DispEventAdvise((IDispatch*)m_spApp);
  if(FAILED(hr)){
   //MessageBox(NULL, "FAILED", "FIELED", MB_OK);
  }

这样就可以了,可以点击PPT播放按钮看一下效果,是不是弹出了自己的对话框。提示,不要忘了在插件卸载的时候断开新增的连接点事件。调试的时候不要忘记把OFFICE库改成自已机器上库的相应路径及版本。
 

 

更多技术文章请参看施昌权的个人网站: http://www.joyvc.cn

 

 

抱歉!评论已关闭.