0

VS2010とDotNetFramework2.0を使用しています。[拡張性]->[Outlook用共有アドイン]でプロジェクトを作成しました。ReplyToAllイベントをキャプチャしようとしていますが、起動されません。以下のコードをご覧ください。

OnConnectionメソッド

inspectors = applicationObject.Inspectors;                        
inspectors.NewInspector += new Outlook.InspectorsEvents_NewInspectorEventHandler(inspectors_NewInspector);


void inspectors_NewInspector(Microsoft.Office.Interop.Outlook.Inspector Inspector)
    {
        mailItem = null;
        try
        {
            Outlook.NameSpace ns = Inspector.Session;
            Outlook.MAPIFolder inbox = ns.GetDefaultFolder(
              Outlook.OlDefaultFolders.olFolderInbox);

            foreach (object o in inbox.Items)
            {
                mailItem = o as Outlook.MailItem;
                if (mailItem != null)
                {
                    break;
                }
            }
            if (mailItem == null)
            {
                MessageBox.Show("Couldn't find a mail item.");
            }
            else
            {
                ((Outlook.ItemEvents_10_Event)mailItem).ReplyAll += new
                    Outlook.ItemEvents_10_ReplyAllEventHandler(Connect_ReplyAll);
            }                              
        }
        catch (Exception ex)
        {
            MessageBox.Show("asdgh"+ex.StackTrace);
        }        
    }


void Connect_ReplyAll(object Response, ref bool Cancel)
    {
        MessageBox.Show(Response+"Hello You have Clikced ReplyTOAll");
    }

しかし、Connect_ReplyAllメソッドが呼び出されます何が間違っていますか?

動作しているがイベントが登録されている新しいコード

public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom)
    {
        try
        {
             applicationObject = (Outlook.Application)application;
            if (connectMode != Extensibility.ext_ConnectMode.ext_cm_Startup)
            {
                OnStartupComplete(ref custom);
            }
            addInInstance = addInInst;
            inspectors = applicationObject.Inspectors;
            explorer = applicationObject.Explorers.Application.ActiveExplorer();

            explorer.SelectionChange += new Outlook.ExplorerEvents_10_SelectionChangeEventHandler(explorer_SelectionChange);                                                
            inspectors.NewInspector += new 
                Outlook.InspectorsEvents_NewInspectorEventHandler(inspectors_NewInspector);               
        }
        catch(Exception ex)
        {
            MessageBox.Show(""+ex.StackTrace);
        }
        //((Microsoft.Office.Interop.Outlook.ItemEvents_10_Event)mailItem).Reply += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReplyEventHandler(ReplyToAllEvent);
    }

void explorer_SelectionChange()
    {
        try
        {
            Outlook.MailItem mailExplorer=null;
            mailTO = "";
            mailCC = "";
            mailBCC = "";
            foreach (object selectedItem in explorer.Selection)
            {
                mailExplorer = selectedItem as Outlook.MailItem;
                //MessageBox.Show("" + mailItem.EntryID.ToString());
                break;
            }               
            if (mailExplorer != null)
            {
                if (selectedItems.Contains(mailExplorer.EntryID.ToString()))
                {
                    selectedItems.Remove(mailExplorer.EntryID);
                    ((Outlook.ItemEvents_10_Event)mailExplorer).ReplyAll -= new Outlook.ItemEvents_10_ReplyAllEventHandler(Connect_ReplyAll);
                    ((Outlook.ItemEvents_10_Event)mailExplorer).Reply -= new Outlook.ItemEvents_10_ReplyEventHandler(Connect_Reply);                        
                }                    
                ((Outlook.ItemEvents_10_Event)mailExplorer).ReplyAll +=
                    new Outlook.ItemEvents_10_ReplyAllEventHandler(Connect_ReplyAll);
                ((Outlook.ItemEvents_10_Event)mailExplorer).Reply +=
                    new Outlook.ItemEvents_10_ReplyEventHandler(Connect_Reply);
                selectedItems.Add(mailExplorer.EntryID);
                mailTO = mailExplorer.To;
                mailCC = mailExplorer.CC;
                mailBCC = mailExplorer.BCC;
            }
        }
        catch(Exception ex)
        {                
            MessageBox.Show(""+ex.StackTrace);
        }                                 
    }

「メールアイテムをReplyAllイベントに登録すると、同じメールアイテムが選択された場合、イベントが複数回発生します。」この問題は上記のコードを使用することで解決されますが、イベントを切り離すと新しいエラーが発生します。助けてください

このエラーが発生します

4

1 に答える 1

2

イベントを発生させると予想されるCOMオブジェクトは、存続している必要があります。上記のコードは、受信トレイ内のすべてのアイテムをループし(痛い!なぜ?)、各反復で同じ変数を使用して、前の値を消去します。
メッセージに返信するには、最初にメッセージを選択する必要があるため、選択したアイテム(Explorer.Selectionコレクション)をループするだけで済みます。Explorer.SelectionChangedイベントをフックして選択を追跡し、そのイベントハンドラーで、Explorer.Selectionコレクション内のすべてのアイテムをループして、独自のList<MailItem>リストに配置します。このようにして、オブジェクトをリストから削除するまで、オブジェクトは存続します。
使用する代わりに、それよりも優れていますList<MailItem>リストで、MailItemをプライベートメンバーとして格納する独自のラッパーを作成し、そのラッパーでReplyAllイベントをフックします。このようにして、イベントが発生したときに、どのMailItemオブジェクトがイベントを発生させたかがわかります。選択した各MailItemのラッパーは、List<MyMailItemWrapper>コレクションに保存できます。

于 2013-02-16T19:15:56.530 に答える