Outlook 2013表单区域和删除键

时间:2015-01-28 21:57:54

标签: c# outlook outlook-addin outlook-2013

所以,我终于不得不处理这个恼人的问题了。它似乎是一个已知的“bug”,似乎没有一个很好的解决方法。我想知道最好的解决方法是什么。

一点点信息。在我的表单区域中,我有一个Winform控件和一个WPF控件。用户无法在Winform控件上执行某些键组合(Ctrl-A选择全部,Delete键删除电子邮件而不是突出显示的文本),但WPF控件上的一切正常。

我尝试使用WindowsFormHost将Winform控件添加到WPF控件,但这使得它更糟糕,因为它之后不会注册退格键。我尝试捕获电子邮件的删除事件,但我无法触发.BeforeDeleteExplorer.BeforeItemCut事件也是如此。目前我正在尝试捕获WndProc事件以重新指导关键事件,但似乎应该有更好/更简单的方法。

不确定如何从这里继续。欢迎任何指导方面的帮助。以下是我试图捕获电子邮件删除事件的方法。

Outlook.MailItem _selEmail;

// This does get triggered
private void Explorer_SelectionChange()
{
    var actExplorer = this.Application.ActiveExplorer();
    if(this.Application.ActiveExplorer().Selection.Count > 0)
    {
        var selObject = actExplorer.Selection[1];
        if(selObject is Outlook.MailItem)
        {
            _selEmail = selObject as Outlook.MailItem;
            _selEmail.BeforeEmailDelete -=
                new Outlook.ItemEvents_10_BeforeDeleteEventHandler(Email_BeforeDelete);
            _selEmail.BeforeEmailDelete += 
                new Outlook.ItemEvents_10_BeforeDeleteEventHandler(Email_BeforeDelete);
        }
    }
}

// Haven't gotten this to trigger. The Console.Write("") is there
// only for a breakpoint;
private void Email_BeforeDelete(object sender, ref bool cancel)
{
    Console.WriteLine("");
}

1 个答案:

答案 0 :(得分:1)

首先,我建议打破属性和方法调用链,并在单独的代码行上声明每个属性或方法调用。因此,您将能够在适当的位置释放底层COM对象。完成使用后,使用System.Runtime.InteropServices.Marshal.ReleaseComObject释放Outlook对象。然后在Visual Basic中将变量设置为Nothing(C#中为null)以释放对该对象的引用。您可以在MSDN的Systematically Releasing Objects文章中详细了解相关内容。

尝试使用Outlook中的空格键选项关闭单键读取,这样您就可以快速浏览阅读窗格中的消息。空格键滚动当前项目。在项目的末尾,它会跳转到消息列表中的下一个未读项目。

enter image description here

最后,在Outlook表单上使用WPF控件会产生一个众所周知的问题。 Outlook习惯于吞下各种密钥,而不是将它们发送到您的代码或表单区域。空格键,制表符,退格键是在阅读窗格中按下键时受影响的键。您可以找到similar forum thread