最近、ユーザーのOutlookデータベースをサードパーティアプリケーションと同期するクライアント用のOutlookプラグイン(Outlook 2010で使用するため)を作成しました。これは正常に機能します。ただし、クライアントが実行したいことの1つは、標準のコピー/貼り付け機能を利用してOutlookでレコードを複製することです。問題は、サードパーティシステムに送信されたOutlookレコードのUserPropertyを定義することです(サードパーティシステムからの内部IDを格納します)。クライアントがコピー/貼り付けを実行すると、このUserPropertyもコピーされます(同じサードパーティIDで複数のレコードが作成されるため、これは不適切です)。コピー/貼り付けが行われていることをコードで検出し、保存する前にレコードに変更(このUserPropertyの削除)を行う方法があるかどうか疑問に思いました。彼らはタスク、予定、
以下の提案に従って、以下に示すように、BeforeItemPasteを活用しようとしました。
private void ThisAddIn_Startup(object sender, System.EventArgs e) {
Globals.ThisAddIn.Application.ActiveExplorer().BeforeItemPaste += new Outlook.ExplorerEvents_10_BeforeItemPasteEventHandler(Item_BeforeItemPaste);
}
private void Item_BeforeItemPaste(ref System.Object ClipboardContent,
Microsoft.Office.Interop.Outlook.MAPIFolder Target, ref bool Cancel) {
System.Windows.Forms.MessageBox.Show("Trying to paste");
}
このメッセージは、コピー/貼り付けを初めて実行したときに表示され、その後は二度と表示されません。理論的にはOutlookのすべてのエクスプローラーにアクセスできるApplication.Explorersを利用してみましたが、探していた個々のエクスプローラー(予定、タスク、連絡先)にアクセスできませんでした(その中には1つの要素しかありませんでした)デバッグしたときの「配列」)。また、MAPIFolder.GetExplorerを呼び出して、これらの特定のExplorerアイテムにアクセスしようとしましたが、これは常にnullを返しました。