VSTO Office加载项c#回复所有邮件’;I don’我不常露面

VSTO Office加载项c#回复所有邮件’;I don’我不常露面,c#,outlook,vsto,C#,Outlook,Vsto,我正在为outlook2010构建一个外接程序,当用户单击Reply“回复所有我想要的内容”时,会出现一个消息框,显示“确定吗?”。我们组织中的用户太多,点击回复的用户太多,他们都不知道自己在做什么 这可能看起来有些过分,但我们计划统计接收者的数量,如果其大于X,则显示此消息 我使用下面的代码,出于某种原因,消息框要么只显示一次,要么每次都随机显示 有人能帮忙吗 private Outlook.Application _application = null; private void This

我正在为
outlook2010
构建一个外接程序,当用户单击
Reply
“回复所有我想要的内容”时,会出现一个消息框,显示“确定吗?”。我们组织中的用户太多,点击
回复
的用户太多,他们都不知道自己在做什么

这可能看起来有些过分,但我们计划统计接收者的数量,如果其大于
X
,则显示此消息

我使用下面的代码,出于某种原因,消息框要么只显示一次,要么每次都随机显示

有人能帮忙吗

private Outlook.Application _application = null;

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    _application = Globals.ThisAddIn.Application;
    _application.ItemLoad += new Outlook.ApplicationEvents_11_ItemLoadEventHandler(_application_ItemLoad);
}

private void GenerateItemMessage(object item, string operation)
{
    MailItem mi = item as Outlook.MailItem;
    MessageBox.Show(String.Format("MailItem {0} will be {1}", mi.Subject, operation));
}

private void ThisAddIn_ReplyAll(object item, ref bool cancel)
{
    GenerateItemMessage(item, "ReplyToAll");
}

private void _application_ItemLoad(object Item)
{
    ((Outlook.ItemEvents_10_Event)Item).ReplyAll += new Outlook.ItemEvents_10_ReplyAllEventHandler(ThisAddIn_ReplyAll);
}

如果要处理事件,必须保持源对象处于活动状态:

private void GenerateItemMessage(object item, string operation)
{
    MailItem mi = item as Outlook.MailItem;
    MessageBox.Show(String.Format("MailItem {0} will be {1}", mi.Subject, operation));
}
mi
对象的范围受其声明方法的限制。
GC
可以在任何时间点从堆中滑动它。因此,您需要在全局范围内声明它:

MailItem mi = null;
private void GenerateItemMessage(object item, string operation)
{
    mi = item as Outlook.MailItem;
    MessageBox.Show(String.Format("MailItem {0} will be {1}", mi.Subject, operation));
}

或者如果你同时处理许多对象,你可以考虑维护一个对象列表。 您应该在代码中的任何地方都这样做,例如,对于以下示例,您似乎没有这样做:

private void _application_ItemLoad(object Item)
{
    ((Outlook.ItemEvents_10_Event)Item).ReplyAll += new Outlook.ItemEvents_10_ReplyAllEventHandler(ThisAddIn_ReplyAll);
}
\u application\u ItemLoad
方法完成后,您将无法获得
replyll
事件激发。如果要触发事件,需要保持对象处于活动状态:

Outlook.ItemEvents_10_Event _item;
private void _application_ItemLoad(object Item)
{
    _item = (Outlook.ItemEvents_10_Event)Item;
    _item.ReplyAll += new Outlook.ItemEvents_10_ReplyAllEventHandler(ThisAddIn_ReplyAll);
}

不要使用
ItemLoad
(或除此之外),尝试捕获
Explorer.SelectionChange
事件,并在所选项目上设置
replyll
事件处理程序。

谢谢Eugene。通过将我的代码更改为您的建议,它现在可以更加正常地工作,但有时仍然无法启动。对于GC,你是说这可能永远不会完全起作用吗?Eugene是你上面写的一个,mi在生成消息部分之外声明。谢谢你的回答。你能解释一下为什么会发生这种情况吗?为什么再次单击“全部回复”时,不会再次调用此Addin\u ReplyAll?