Outlook 2013 窗体区域和删除键

Outlook 2013 Form Region and the Delete Key

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

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

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

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

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("");
}

首先,我建议打破 属性 和方法调用的链条,并在单独的代码行上声明每个 属性 或方法调用。因此,您将能够就地释放底层 COM 对象。使用 MSDN 中的 System.Runtime.InteropServices.Marshal.ReleaseComObject to release an Outlook object when you have finished using it. Then set a variable to Nothing in Visual Basic (null in C#) to release the reference to the object. You can read more about that in the Systematically Releasing Objects 文章。

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

最后,在 Outlook 窗体上使用 WPF 控件会产生 well-known 问题。 Outlook 习惯于吞下各种密钥,而不是将它们发送到您的代码或表单区域。 spacebar、tab、backspace 键在阅读窗格中按下这些键时受到影响。你可以找到一个 similar forum thread.