在我的VSTO outlook应用程序中,为什么调用SelectNamesDialog.Display()会将我的表单移到outlook后面?

在我的VSTO outlook应用程序中,为什么调用SelectNamesDialog.Display()会将我的表单移到outlook后面?,outlook,vsto,Outlook,Vsto,我有一个outlook VSTO应用程序。我试图从加载的表单调用SeletNamesDialog。对话框出现了,这是伟大的,它的模式是好的,但它似乎把我的形式后面的outlook应用程序。因此,在我选择一组名称并单击“确定”后,对话框将消失,但除非我最小化outlook(这显然不理想),否则我的表单将不可见 有没有办法避免这种情况发生?。下面是我用来加载对话框的代码: var app = new Application(); AddressList gal = app.Ac

我有一个outlook VSTO应用程序。我试图从加载的表单调用SeletNamesDialog。对话框出现了,这是伟大的,它的模式是好的,但它似乎把我的形式后面的outlook应用程序。因此,在我选择一组名称并单击“确定”后,对话框将消失,但除非我最小化outlook(这显然不理想),否则我的表单将不可见

有没有办法避免这种情况发生?。下面是我用来加载对话框的代码:

  var app = new Application();

        AddressList gal = app.ActiveExplorer().Session.GetGlobalAddressList();
        var dlg = app.Session.GetSelectNamesDialog();
        dlg.InitialAddressList = gal;
        bool b = dlg.Display();
        var sb = new StringBuilder();
        foreach (Recipient r in dlg.Recipients)
        {
           sb.Append(r.Name +  ";");
        }
        txtPeople.Text = sb.ToString();

Outlook不允许您在显示通讯簿时指定窗体的windows句柄


您可以使用扩展MAPI(仅限C++或Delphi)和方法或Redemption及其方法(它有ParentWindow参数)或对象(它将使用分配给RDOSession.ParentWindow属性的窗口句柄)

当我尝试重新安装时,我遇到以下错误:尝试在OS加载程序锁内执行托管。请勿尝试在DllMain或映像初始化函数中运行托管代码,因为这样做可能会导致应用程序挂起。您对如何使其工作(通过outlook或赎回错误)有何建议可以安全地忽略该警告-它会被记录,因为Redemption会在启动时动态加载MAPI DLL。您可以通过转到调试|异常|托管调试助手并清除LoaderLock条目来忽略该错误。我这样做了,但现在遇到了另一个问题。outlook加载时,它在尝试加载名为Redmption helper的加载项时遇到困难。只是卡住了,我必须杀死outlook.exe并禁用它,否则我无法启动outlook。关于如何调试或使其工作的任何建议??您可以使用RedemptionLoader()完全禁用该加载项或完全避免在注册表中注册赎回。Redemption的外接程序部分只将从Outlook检索到的IMAPISession存储在全局变量中,以便obejcts可以使用它。