0

Outlook のメール作成フォームの tabNewMailMessage に表示されるリボン ボタンがあります。このボタンは、フォームの横に貼り付けられた CustomTaskPane の表示を切り替えます。

通常の練習では、すべてが完全に機能します。しかし、MS Word や Adob​​e Reader などの他のアプリケーションから [電子メールに添付] または [保存して送信] を介して [電子メールの作成] フォームを呼び出すと、ボタンは表示されますが、何も実行されません。

外部呼び出しの場合、明らかに NewInspector イベントが発生しないことを MSDN から知りました。

この場合の回避策を見つけることができませんでした。誰か知っていますか? :(

編集:さらに、プログラム全体で使用するいくつかの変数を含む Global クラス (Visual Studio が作成する非表示の GlobalS クラスではない) があります。アドインは、そこに含まれているものもまったくロードしません。実際に何が読み込まれるかはわかりません。詳しい情報をお持ちの方は、大声でお返事ください!

もう一度編集: ThisAddIn に文字列を入れて、toggleButton の messageBox を介して出力することをテストしましたが、機能しませんでした。誰かが混乱している場合、クリック イベントを実行できない場合、リボン ボタンは読み込まれません。そのため、外部から呼び出された 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:\Users\cat\Desktop\outdebug.txt", string.Join("\n", lalala), Encoding.UTF8);
        }
    }
4

1 に答える 1

1

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
        }
    }
于 2011-02-28T00:18:26.170 に答える