Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否正在Outlook加载项中消失“答复”、“全部答复”和“转发”事件处理程序?_C#_Vsto_Outlook Addin_Office Addins - Fatal编程技术网

C# 是否正在Outlook加载项中消失“答复”、“全部答复”和“转发”事件处理程序?

C# 是否正在Outlook加载项中消失“答复”、“全部答复”和“转发”事件处理程序?,c#,vsto,outlook-addin,office-addins,C#,Vsto,Outlook Addin,Office Addins,我正在尝试从Outlook 2007中捕获事件,以便在“答复/全部答复/转发”窗口激活时加载项。所以我这样做: private void ThisAddIn_Startup(object sender, System.EventArgs e) { this.Application.ItemLoad += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemLoadEventHandler(onItemLoad); }

我正在尝试从Outlook 2007中捕获事件,以便在“答复/全部答复/转发”窗口激活时加载项。所以我这样做:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    this.Application.ItemLoad += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemLoadEventHandler(onItemLoad);
}

Outlook.ItemEvents_10_Event gObj_itemEvt = null;

private void onItemLoad(object Item)
{
    gObj_itemEvt = (Outlook.ItemEvents_10_Event)Item;

    gObj_itemEvt.Reply += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReplyEventHandler(on_Reply);
    gObj_itemEvt.ReplyAll += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReplyAllEventHandler(on_ReplyAll);
    gObj_itemEvt.Forward += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ForwardEventHandler(on_Forward);
}

private void on_Reply(object Item, ref bool cancel)
{
    //Called when user loads Reply window
    LogMessage("Reply opened");
}

private void on_ReplyAll(object Item, ref bool cancel)
{
    //Called when user loads Reply-All window
    LogMessage("Reply-All opened");
}

private void on_Forward(object Item, ref bool cancel)
{
    //Called when user loads Forward window
    LogMessage("Forward opened");
}
这可以工作几次,但随后停止。在这种情况下,我仍然会收到
onimload
事件,但是回复上的
事件、回复上的
事件和转发上的
事件不再广播


我在这里做错了什么?

您将单个对象定义为事件的源,如
Reply
ReplyAll
Forward
。这意味着只能打开一个项目来处理这些事件。让我们想象一下以下场景:打开两个项目并触发
ItemLoad
事件。在第一个项目中,一切顺利,源项目设置正确。但是第二个事件会导致重新写入源项,因此您将不再持有对第一个项的引用,也不会获取它的事件。如果要处理所有打开的Outlook项目的事件,则需要维护对象列表,而不是单个对象引用:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    this.Application.ItemLoad += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemLoadEventHandler(onItemLoad);
}

List<Outlook.ItemEvents_10_Event> gObj_itemEvtList = new List<Outlook.ItemEvents_10_Event>();

private void onItemLoad(object Item)
{
    ItemEvents_10_Event gObj_itemEvt = (Outlook.ItemEvents_10_Event)Item;

    gObj_itemEvt.Reply += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReplyEventHandler(on_Reply);
    gObj_itemEvt.ReplyAll += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReplyAllEventHandler(on_ReplyAll);
    gObj_itemEvt.Forward += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ForwardEventHandler(on_Forward);

   gObj_itemEvtList.Add(gObj_itemEvt);
}

private void on_Reply(object Item, ref bool cancel)
{
    //Called when user loads Reply window
    LogMessage("Reply opened");
}

private void on_ReplyAll(object Item, ref bool cancel)
{
    //Called when user loads Reply-All window
    LogMessage("Reply-All opened");
}

private void on_Forward(object Item, ref bool cancel)
{
    //Called when user loads Forward window
    LogMessage("Forward opened");
}
private void ThisAddIn\u启动(对象发送方,System.EventArgs e)
{
this.Application.ItemLoad+=新的Microsoft.Office.Interop.Outlook.ApplicationEvents\u 11\u ItemLoadEventHandler(onItemLoad);
}
List gObj_itevetlist=新列表();
专用无效加载(对象项)
{
ItemEvents\u 10\u Event gObj\u itemEvt=(Outlook.ItemEvents\u 10\u Event)项;
gObj_itemEvt.Reply+=新的Microsoft.Office.Interop.Outlook.ItemEvents_10_ReplyEventHandler(on_Reply);
gObj_itemEvt.ReplyAll+=新的Microsoft.Office.Interop.Outlook.ItemEvents_10_replyalventhandler(on_ReplyAll);
gObj_itemEvt.Forward+=新的Microsoft.Office.Interop.Outlook.ItemEvents_10_ForwardEventHandler(在_Forward上);
添加(gObj_itemEvt);
}
回复时的私有无效(对象项,参考bool取消)
{
//当用户加载回复窗口时调用
日志信息(“回复打开”);
}
回复上的私有无效(对象项,参考bool cancel)
{
//当用户加载“全部回复”窗口时调用
日志信息(“回复全部打开”);
}
转发时的私有无效(对象项,参考bool取消)
{
//当用户加载转发窗口时调用
日志信息(“向前打开”);
}

谢谢。我需要试试。但有一个问题——如果我一直收集列表中的所有对象,我不会有内存泄漏吗?换句话说,我是否需要在某个时候释放/删除它们?您可以订阅诸如卸载之类的事件,以便在需要时随时随地删除对象。它可以收集列表中的所有内容。但是为了修复内存泄漏,我如何知道在
Unload
方法中卸载的是哪个对象,以便从
gObj_itemEvtList
中删除它?要区分项目及其事件,您可以开发一个inspector包装,请参阅以获取更多信息。对不起。你能用代码说明你是如何使用它的吗?我没有完全明白你的意思。