Outlook 2007 の NewMailEx イベントをフックするはずの VSTO を C# で作成しました。ただし、手動で送受信したり、受信トレイに未読メールが 1 件しかない場合に起動しないことがあります。メッセージが実際に到着する前に、受信トレイで起動したように見えます。
VSTO を使用して ItemAdd または NewMailEX 以外に、毎回新しいメッセージを監視するより良い方法はありますか?
その理由は次のとおりです。「GC は .NET オブジェクトを収集します。これにより、COM オブジェクトが Outlook からラップされます。」解決策は、この .NET オブジェクトへの参照を保持することです。最も簡単な方法は次のとおりです。
// this is helper collection.
// there are all wrapper objects
// , which should not be collected by GC
private List<object> holdedObjects = new List<object>();
// hooks necesary events
void HookEvents() {
// finds button in commandbars
CommandBarButton btnSomeButton = FindCommandBarButton( "MyButton ");
// hooks "Click" event
btnSomeButton.Click += btnSomeButton_Click;
// add "btnSomeButton" object to collection and
// and prevent themfrom collecting by GC
holdedObjects.Add( btnSomeButton );
}
必要に応じて、この (およびその他の) 具体的なボタン (または別のオブジェクト) 用の特別なフィールドを作成することもできます。しかし、これは最も一般的な解決策です。