Взаимодействие с Outlook Доступ к папке удаленных элементов из общего календаря

Рассмотрим следующий сценарий. Кто-то поделился со мной календарем. У меня есть полный доступ к этому календарю. Когда я удаляю элемент в календаре, запускается событие Folder.BeforeItemMove. Все идет нормально. Я хочу отслеживать удаление, проверяя, является ли идентификатор записи MoveTo null или идентификатором записи Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderDeletedItems), который работает. Теперь вернемся к случаю, когда элемент находится в общей папке:

  • Согласно документации Свойство olFolderDeletedItems не используется в качестве параметра для GetSharedDefaultFolders() (просто чтобы убедиться, что я получил доступ к другим разрешенным папкам, которые работали)
  • Я попытался перебрать коллекцию Stores. Календаря там нет
  • Я попытался получить доступ к свойству магазина в папке MoveTo -> null
  • Я попытался получить магазин из сеанса (чтобы проверить PR_IPM_WASTEBASKET_ENTRYID) -> не удалось
  • Я МОГУ получить имя папки. Проблема в том, что она может быть переименована и/или локализована, и я не хочу, чтобы массив со всеми удаленными именами папок плавал вокруг, если я не могу с этим поделать
  • Я тестировал все это, используя простой интерфейс OOM или Redemptions Folder.

Любые идеи?

(Проверено в Outlook 2016)


person knechtrootrecht    schedule 14.06.2016    source источник
comment
Я в замешательстве: вы пытаетесь получить доступ к папке «Удаленные» в общем почтовом ящике? Или ловушку, когда элемент удаляется из общего календаря?   -  person Eric Legault    schedule 15.06.2016
comment
Удаление элемента в общем календаре (а не календаря из общего почтового ящика, к ним я могу получить доступ с помощью метода хранилища, как я описал). Я использую шаблон, описанный в MSDN, для переноса инспекторов (нет проблем, я получаю перед удалением события) Но когда пользователь удаляет встречу, единственным событием, которое вы получаете, являются события папки. Если завернуть предметы в папку Events, то попадете в 7 видов RCW адов.   -  person knechtrootrecht    schedule 15.06.2016
comment
Вы говорите, что событие AppointmentItem.BeforeDelete НЕ срабатывает для элементов в общем календаре, даже если оно находится в оболочке Inspector?   -  person Eric Legault    schedule 15.06.2016
comment
Теоретически это сработало бы, если бы оно было обернуто, НО никогда не бывает события Inspector_New для D'n'D или элементов, удаленных через контекстное меню. Оборачивание их при изменении выбора приводит ко всем забавным делам, когда также открыт инспектор. мероприятие.   -  person knechtrootrecht    schedule 15.06.2016
comment
Что такое D’nD’? Кстати, вы можете перехватить элемент управления ленты для контекстных меню, если вы работаете с выборками. Но я слышу вас - перехват удаления для элемента во всех возможных сценариях - это МНОГО работы. Именно здесь Redemption может быть удобен, так как вы можете перехватить одно событие удаления для всего Магазина.   -  person Eric Legault    schedule 16.06.2016
comment
D’n’D — это перетаскивание. Я, конечно, попробую способ Redemption, но я не слишком оптимистичен в том, что смогу заполучить Store, потому что я не могу получить его через ‹code›Folder.Store‹/code›, хотя ‹code›Folder.StoreId‹/code › содержит правильный EntryID папки   -  person knechtrootrecht    schedule 16.06.2016
comment
Магазины тоже не обрезают его, я могу получить событие, что что-то произошло, но я не могу его отменить, что необходимо для моего приложения.   -  person knechtrootrecht    schedule 16.06.2016
comment
Да, использование Redemption для отслеживания глобальных удалений не поможет для общей папки. Вы говорите, что DnD не запускает NewInspector, если вы перетаскиваете электронное письмо в модуль календаря, чтобы создать новую встречу?   -  person Eric Legault    schedule 17.06.2016
comment
Я думаю, что DnD не запускает нового инспектора при перемещении встреч, при создании встреч все работает нормально. В качестве обходного пути я получаю доступ к инспектору и выпускаю его через Selection[x].GetInspector (который запускает NewInspector)   -  person knechtrootrecht    schedule 17.06.2016
comment
Если вам нужно перехватить перемещение встречи из одного календаря в другой в представлении папки, вам также потребуется перехватить Items.ItemRemove для исходной папки.   -  person Eric Legault    schedule 17.06.2016
comment
Нет, это движение внутри папки   -  person knechtrootrecht    schedule 17.06.2016
comment
Что ты имеешь в виду? Элемент нельзя переместить в ту же папку, в которой он уже находится   -  person Eric Legault    schedule 17.06.2016
comment
Я могу перетащить встречу из времени A в другое время B в том же календаре   -  person knechtrootrecht    schedule 20.06.2016


Ответы (2)


RDOStore.GetDefaultFolder(olFolderDeletedItems) и RDOSession.GetSharedDefaultFolder(olFolderDeletedItems) оба работают в Redemption.

person Dmitry Streblechenko    schedule 18.06.2016
comment
RDOSession.GetSharedDefaultFolder(olFolderDeletedItems) не будет работать, как указано в документации RDO: тип папки. Принимает те же значения, что и метод Namespace.GetDefaultFolder в объектной модели Outlook и в MSDN Документация Пишут, что нельзя использовать olFolderDeletedItems. Что согласуется с моим кодом ошибки недопустимого аргумента - person knechtrootrecht; 20.06.2016
comment
На заметку: для получения GetSharedDefaultFolder (NameOrAddressOrObject, FolderType) требуется RDOAddressentry или RDORecipient, или имя, или адрес электронной почты. - person knechtrootrecht; 20.06.2016
comment
GetSharedDefaultFolder в Redemption не имеет такого ограничения. olFolderDeletedItems — это просто еще одна папка по умолчанию. - person Dmitry Streblechenko; 20.06.2016
comment
Сегодня я снова попробовал предложенный вами метод в пустом проекте. Все, что я получаю, это исключение COM с информацией: не удалось найти DN магазина. Что ожидается, поскольку я получаю только EntryID для Store в объекте Folder (либо OOM, либо RDO), само свойство Folder.Store имеет значение null. - person knechtrootrecht; 21.06.2016
comment
Похоже, ошибка возвращается при попытке открыть общий почтовый ящик, а не при открытии папки «Удаленные». Какой у вас код, который открывает магазин? - person Dmitry Streblechenko; 21.06.2016
comment
Вы только что дали мне идею, почему это не может работать! В ситуации, когда кто-то делится только своим календарем, я могу получить доступ только к этой специальной папке. Поскольку он принадлежит Магазину, я вижу StoreID, но не могу получить доступ к Folder.Store. По этой же причине я не могу получить доступ к магазину или к общей папке по умолчанию, например. olDeletedItems, это работает, только если пользователь не только поделился своим календарем, но и своим почтовым ящиком. - person knechtrootrecht; 27.06.2016

Если у вас есть доступ к календарю как к общему календарю (например, отправленное вам по электронной почте приглашение через OWA), удаленные элементы переходят в ВАШУ папку удаленных элементов. Это вы можете получить через Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderDeletedItems)

Если Календарь находится во втором почтовом ящике в вашем профиле, удаленный элемент переходит в папку удаленных элементов ЭТОЙ учетной записи, к которой вы можете получить доступ через

Outlook.Store _Store = MoveTo.Store;

Outlook.Folder _Folder = MoveTo.GetDefaultFolder (OlDefaultFolders.olFolderDeletedItems) as Outlook.Folder;

Вы можете различать эти два сценария, проверив, является ли Folder.Store нулевым (как в случае общего календаря без почтового ящика).

person knechtrootrecht    schedule 27.06.2016