#c# #outlook #vsto #outlook-addin
#c# #outlook #vsto #outlook-добавление
Вопрос:
Идея моего плагина заключается в том, что когда я нажимаю (прочитать) или дважды щелкаю (открыть) на любое электронное письмо в моем почтовом ящике Outlook Explorer, отображается форма Windows. Я понимаю, что я должен поместить обработчик событий в метод ThisAddIn_Startup, чтобы он работал, пока Outlook открыт. Я попробовал следующее:
Outlook.MailItem mailItem = new Outlook.MailItem();
mailItem.Open = new Microsoft.Office.Interop.Outlook.ItemEvents_10_OpenEventHandler(ClickSobreCorreo);
mailItem.Read = new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReadEventHandler(ClickSobreCorreo);
Outlook.AppointmentItem Cita = new Outlook.AppointmentItem();
Cita.Open = new Microsoft.Office.Interop.Outlook.ItemEvents_10_OpenEventHandler(ClickSobreCorreo);
Cita.Read = new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReadEventHandler(ClickSobreCorreo);
Outlook.MeetingItem Reunion = new Outlook.MeetingItem();
Reunion.Open = new Microsoft.Office.Interop.Outlook.ItemEvents_10_OpenEventHandler(ClickSobreCorreo);
Reunion.Read = new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReadEventHandler(ClickSobreCorreo);
Но я получаю сообщение об ошибке:
System.Runtime.Службы взаимодействия.COMException (0x80040154): Класс не зарегистрирован (Исключение из HRESULT: 0x80040154
Затем я попробовал это, что нашел в Интернете, но работает только случайное письмо (это даже не первое письмо), а событие чтения выполняется только один раз и не более.
Outlook.MailItem mailItem;
private void ThisApplication_Startup (object sender, EventArgs e) {
Outlook.NameSpace ns = this.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 to connect to.");
} else {
MessageBox.Show (String.Format (
"Connected to the mail item with subject {0}.",
mailItem.Subject);
mailItem.Read = new Outlook.ItemEvents_10_ReadEventHandler (
MailItem_Read);
mailItem.Open = new Outlook.ItemEvents_10_OpenEventHandler (
MailItem_Open);
mailItem.Write = new Outlook.ItemEvents_10_WriteEventHandler (
MailItem_Write);
((Outlook.ItemEvents_10_Event) mailItem).Close = new Outlook.ItemEvents_10_CloseEventHandler (
MailItem_Close);
}
}
}
void MailItem_Read() {
MessageBox.Show("Read");
}
void MailItem_Open(ref bool cancel) {
MessageBox.Show("Open");
}
void MailItem_Write(ref bool cancel) {
MessageBox.Show("Write");
}
void MailItem_Close(ref bool cancel) {
MessageBox.Show("Close");
}
Что мне делать?
Должен ли я просматривать все электронные письма и назначать им обработчик событий? Если да, то как бы вы поступили с входящими электронными письмами, должен ли я добавить обработчик событий для входящих электронных писем и в метод добавить обработчик событий для открытия и чтения электронной почты?
Ответ №1:
Не используйте « new
» с Outlook.MailItem
— этот объект невозможно создать, Outlook.Application
есть, но вы все равно получаете экземпляр этого объекта (доверенную версию) из Outlook.
Я подозреваю, что вам нужно отслеживать Exploer.SelectionChange
событие ( Explorer
может быть получено из Applica5tion.ActiveExplorer
и Application.Explorers.NewExplorer
) и настраивать обработчики событий для выбранных элементов (Explorer.Выбор).
Убедитесь, что объекты, вызывающие события ( Explorer
и Explorers
), на которые ссылаются, не являются мусором.
Комментарии:
1. Да, вы не можете использовать new, я думал, что его можно создать так же, как интерфейс приложения. Я уже использовал Explorer. SelectionChange но плагин имеет плохое поведение, потому что при использовании form.showdialog Outlook не читает почту, и я хочу, чтобы пользователь мог видеть почту, но не мог выбрать другую почту, пока форма открыта, по этой причине я думаю, что событие чтения — лучший вариант узнать, когда запускать форму.
2. Второй вариант в моем коде работает только для одного электронного письма. Должен ли я просмотреть весь почтовый ящик и назначить ему обработчики событий один за другим? И для входящих писем я должен добавить обработчик событий для входящих писем, а в методе обработчика добавить обработчик событий для открытия и чтения электронной почты?
3. Я думаю, вы упустили мою мысль — используйте событие SelectionChange, чтобы освободить старые приемники событий и установить новые для выбранных элементов, чтобы вы могли обработать событие Open для выбранных элементов.