Если OpenFile ведет себя асинхронно, я бы посоветовал вам рассмотреть вопрос об изменении логики, чтобы полагаться на другое событие, которое зависит от активируемого документа.
Например, вы пытались запустить OpenFile с помощью сочетания клавиш, а затем поставить в очередь поиск, чтобы впоследствии он обрабатывался событием VS? (Код ниже был взят из надстройки Visual Studio 2010, но я считаю, что события одинаковы.)
// убедитесь, что это переменные класса, иначе они могут неправильно получить GC и нарушить взаимодействие COM
private WindowEvents _winEvents = null;
частный DTE2 _applicationObject;
в соединении:
_events = _applicationObject.Events;
_winEvents = _events.get_WindowEvents();
_winEvents.WindowActivated += new _dispWindowEvents_WindowActivatedEventHandler(WindowActivated);
Затем вы поместите некоторый код в WindowActivation:
void WindowActivated(Window GotFocus, Window LostFocus)
{
Document gotFocusDoc = GotFocus.Document;
if (gotFocusDoc != null)
{
string fileExt = Path.GetExtension(gotFocusDoc.Name);
Там вы будете искать файл, который хотите отсканировать (возможно, вам понадобится сохранить список и т. Д.).
Что касается второго вопроса, вы можете просто отсканировать документ самостоятельно, как только вы получите доступ, как я предлагал выше.