我想做的事:
编写一个监听Office事件的应用程序。我想从计算机上打开的任何实例中监听事件。例如,如果我在Word中收听BeforeDocumentSave,那么只要主机上任何Word实例保存文档,我都希望激活此方法的接收器。
另一个要求是,我要用C ++编写而不使用MFC或ATL。
我所做的:
我已经编写了一个程序来监听Word事件。请参见下面的代码。
问题:
它不起作用-尽管我打开了Word应用程序并执行了应触发事件的操作,但从未输入事件处理程序。
我有一些具体的问题,当然,任何其他意见都将受到欢迎!
问题:
是否可以侦听不是由我启动的应用程序中的事件?在我发现的所有示例中,侦听应用程序都会启动要侦听的Office应用程序。
在Microsoft howto(http://support.microsoft.com/kb/183599/EN-US/)中,我发现以下注释:
但是,大多数事件(例如Microsoft Excel的Workbook事件)并非以DISPID 1开头。在这种情况下,必须在MyEventSink.cpp中显式修改分派映射,以使DISPID与正确的方法匹配。
如何修改调度图?
码:
这是我的项目的头文件,后跟C文件:
#ifndef _OFFICEEVENTHANDLER_H_
#define _OFFICEEVENTHANDLER_H_
// 000209FE-0000-0000-C000-000000000046
static const GUID IID_IApplicationEvents2 =
{0x000209FE,0x0000,0x0000, {0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
struct IApplicationEvents2 : public IDispatch // Pretty much copied from typelib
{
/*
* IDispatch methods
*/
STDMETHODIMP QueryInterface(REFIID riid, void ** ppvObj) = 0;
STDMETHODIMP_(ULONG) AddRef() = 0;
STDMETHODIMP_(ULONG) Release() = 0;
STDMETHODIMP GetTypeInfoCount(UINT *iTInfo) = 0;
STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) = 0; …Run Code Online (Sandbox Code Playgroud)