При вызове Search
запрос выполняется в пользовательском интерфейсе, а программный механизм c для получения результатов поиска отсутствует. Также метод Search
не обеспечивает обратного вызова, чтобы разработчик мог определить, когда поиск завершен.
Вместо этого я бы предложил использовать метод AdvancedSearch класса Application
, который обеспечивает обратный вызов для получения результатов после. Ключевые преимущества использования метода AdvancedSearch в Outlook:
- Поиск выполняется в другом потоке. Вам не нужно запускать другой поток вручную, поскольку метод AdvancedSearch запускает его автоматически в фоновом режиме.
- Возможность поиска любых типов элементов: почта, встреча, календарь, заметки и c. в любом месте, т.е. за пределами определенной папки. Методы
Restrict
и Find
/ FindNext
могут применяться к конкретной коллекции Items
(см. Свойство Items
класса Folder
в Outlook). - Полная поддержка DASL запросы (для поиска также можно использовать настраиваемые свойства). Подробнее об этом можно прочитать в статье Фильтрация в MSDN. Чтобы повысить производительность поиска, можно использовать ключевые слова мгновенного поиска, если для магазина включен мгновенный поиск (см. Свойство
IsInstantSearchEnabled
класса Store). - Вы можете остановить процесс поиска в любой момент, используя
Stop
метод класса Search.
Чтобы получить результаты поиска, вам необходимо обработать событие AdvancedSearchComplete
, которое используется для возврата объекта, созданного методом AdvancedSearch
. Это событие срабатывает только при программном выполнении метода AdvancedSearch
.
Public blnSearchComp As Boolean
Private Sub Application_AdvancedSearchComplete(ByVal SearchObject As Search)
MsgBox "The AdvancedSearchComplete Event fired."
blnSearchComp = True
End Sub
Sub TestAdvancedSearchComplete()
Dim sch As Outlook.Search
Dim rsts As Outlook.Results
Dim i As Integer
blnSearchComp = False
Const strF As String = "urn:schemas:mailheader:subject = 'Test'"
Const strS As String = "Inbox"
Set sch = Application.AdvancedSearch(strS, strF)
While blnSearchComp = False
DoEvents
Wend
Set rsts = sch.Results
For i = 1 To rsts.Count
MsgBox rsts.Item(i).SenderName
Next
End Sub
После использования Search
в пользовательском интерфейсе Outlook вы можете получить доступ к CurrentView
, открыв соответствующие свойства в Explorer
объект. Класс View
предоставляет свойство Filter , которое возвращает строковое значение, представляющее фильтр для представления. Значением этого свойства является строка в синтаксисе поиска и обнаружения DAV (DASL), которая представляет текущий фильтр для представления. Таким образом, вы можете использовать его для строки поиска AdvancedSearch
.