CustomTaskPanes和从Outlook外部调用NewMailMessage

我有一个功能区按钮,显示在Outlook的撰写电子邮件表单中的tabNewMailMessage上,此按钮切换粘贴到表单一侧的CustomTaskPane的可见性。 在通常的练习中,一切都很完美。但是,当通过“附加到电子邮件”或“保存和放大”调用撰写电子邮件表单时从MS Word或Adobe Reader等其他应用程序发送'按钮出现但不再执行任何操作。 我从MSDN中了解到,在外部调用的情况下,NewInspector事件显然不会触发。 我无法找到这种情况的任何变通方法,这里有人知道吗? :( 编辑:另外,我有一个Global类(不是Visual Studio创建的隐藏的GlobalS类),它包含我在整个程序中使用的一些变量。 Addin也不会加载其中包含的任何东西。如果有人有更多的信息,很难说出实际上会加载什么,请大声欢呼! 再次编辑:测试将字符串放入ThisAddIn并通过toggleButton中的messageBox打印它不起作用。如果有人感到困惑,如果无法执行click事件,则不会加载功能区按钮,因此外部调用的Compose表单似乎会跳过ThisAddIn中的所有代码以及任何不是功能区本身的类。 我真的需要帮助解决这个问题! :( 再次编辑:这是我到目前为止所获得的,ThisAddIn启动事件不会触发,外部类中的属性可能无法读取,但是像ThisAddIn.SayHelloWorld()这样的外部方法可以正常工作。 再次编辑! :
private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {

        //MessageBox.Show(,"TEST");
        try
        {               
            inspectors = Globals.ThisAddIn.Application.Inspectors;
            inspectors.NewInspector += new InspectorsEvents_NewInspectorEventHandler(Inspectors_NewInspector);

            foreach (Inspector insp in inspectors)
            {
                //insp.
                Inspectors_NewInspector(insp);
            }
        }
        catch (System.Exception ex)
        {
            List<string> lalala = new List<string>();
            lalala.Add(ex.GetType().ToString());
            lalala.Add(ex.Message);
            lalala.Add(ex.StackTrace);
            File.WriteAllLines(@"C:outdebug",lalala.ToArray());
        }
    }
再次! :
void Inspectors_NewInspector(Inspector Inspect)
    {
        try
        {
            if (Inspect.CurrentItem is MailItem)
            {
                Global.mail = Inspect.CurrentItem;
                Global.inspectorWrappersValue.Add(Inspect, new InspectorWrapper(Inspect, Global.mail));
                //inspectorw
            }
        }
        catch (System.Exception ex)
        {
            List<string> lalala = new List<string>();
            lalala.Add(ex.GetType().ToString());
            lalala.Add(ex.Message);
            lalala.Add(ex.StackTrace);
            lalala.Add(Global.SiteConnectionManager.ToString());
            File.WriteAllText(@"C:UserscatDesktopoutdebug.txt", string.Join("n", lalala), Encoding.UTF8);
        }
    }
    
已邀请:
在ThisAddIn.Startup中对所有代码使用try / catch处理程序是个好主意,因为Outlook对于吃掉所有异常都是积极的,所以如果有问题,你将永远不会知道它。 但是,我认为真正导致问题的是http://social.msdn.microsoft.com/Forums/en/vsto/thread/60c75274-e15a-4696-afa6-79de8fbd707d中讨论的Outlook问题。解决方案是创建一个计时器,并在它发生时检查是否有现有的检查员。我下面的内容应该有很多帮助,但它不是一个完整的解决方案,因为它不能处理NewInspector触发并且计时器也指示检查员的情况。因此,您必须添加一些逻辑,以确保不为检查器添加2个任务窗格。
public partial class ThisAddIn
{
    private DispatchTimer _newInspectorStartupTimer;

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        try
        {
            // check for existing explorers and inspectors and
            // set up event handlers for new ones

            // here is how you set up the inspector event handler:
            ThisAddIn.Application.Inspectors.NewInspector += new Microsoft.Office.Interop.Outlook.InspectorsEvents_NewInspectorEventHandler(Inspectors_NewInspector);

            // create a timer.  When the timer fires, check if any
            // Inspector windows currently exist, and add task panes
            // for them if needed.
            _newInspectorStartupTimer = new DispatcherTimer();
            _newInspectorStartupTimer.Interval = TimeSpan.FromSeconds(2.0);
            _newInspectorStartupTimer.Tick += new EventHandler(NewInspectorStartupTimer_Tick);
            _newInspectorStartupTimer.Start();
        }
        catch (System.Exception ex)
        {
            // log the exception type, message, and stack trace here
        }
    }

    private void NewInspectorStartupTimer_Tick(object sender, EventArgs e)
    {
        int inspectorCount = _inspectors.Count;
        if (inspectorCount > 0)
        {
            for (int i = 1; i <= _inspectors.Count; ++i)
            {
                Inspector inspector = _inspectors[i];
                Inspectors_NewInspector(inspector);
            }
        }
    }

    // Inspectors_NewInspector also has a try/catch.  Note that
    // Inspectors_NewInspector will be called multiple times
    // for each inspector, due to the timer.
    private void Inspectors_NewInspector(Inspector inspector)
    {
        try
        {
            // you need to check whether you have already created a
            // task pane for this inspector.  If not, create your
            // task pane here.
        }
        catch (System.Exception ex)
        {
            // log the exception type, message, and stack trace here
        }
    }
    

要回复问题请先登录注册