Как заблокировать OpenFile в надстройке Visual Studio - PullRequest
4 голосов
/ 13 июля 2010

У меня есть надстройка Visual Studio 2008, которая, когда я нажимаю определенную горячую клавишу, открывает определенный файл (отличается в зависимости от контекста горячей клавиши), а затем ищет в этом файле определенную строку (опять же, в зависимости от контекста).времени это работает безупречно, но иногда, если файл, который он открывает, слишком велик, поиск не будет выполнен.

Вот фрагмент кода:

Window xmlWindow = Commands.Application.ItemOperations.OpenFile(objectFilename, EnvDTE.Constants.vsViewKindPrimary);
Find find = xmlWindow.Document.DTE.Find;
find.Action = vsFindAction.vsFindActionFind;
find.FindWhat = String.Format("Name=\"{0}\"", objectLocalName);
if (find.Execute() == vsFindResult.vsFindResultFound) {
     MessageBox.Show("Found!");
}



1. Есть ли способ заставить его работать всегда (например, путем блокировки в OpenFile)?

2. На менее важном примечании, есть ли способ выполнить такой поиск, не отображая результаты на панели «Результаты поиска» (это приводит к тому, что мои старые результаты удаляются этим поиском, который используется толькочтобы навести курсор на эту часть файла)?


Ответы [ 2 ]

11 голосов
/ 19 июля 2010

Если 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);

Там вы будете искать файл, который хотите отсканировать (возможно, вам понадобится сохранить список и т. Д.).

Что касается второго вопроса, вы можете просто отсканировать документ самостоятельно, как только вы получите доступ, как я предлагал выше.

0 голосов
/ 21 июля 2010

Я думаю, что метод DTE.ItemOperations.OpenFile () является синхронным.Попробуйте использовать следующий фрагмент кода для VS2008.

using EnvDTE;

Window win = _applicationObject.ItemOperations.OpenFile(@"path-to-xml-file", Constants.vsViewKindPrimary);
TextDocument doc = win.Document.Object("TextDocument") as TextDocument;
if (doc != null)
{
    EditPoint searchStart = doc.StartPoint.CreateEditPoint();
    EditPoint endOfFoundText = null;
    TextRanges ranges = null;

    bool result = searchStart.FindPattern("Text-to-search", (int)vsFindOptions.vsFindOptionsNone, ref endOfFoundText, ref ranges);
    if (result)
    {
        // Result is bounded by searchStart and endOfFoundText points.
        System.Windows.Forms.MessageBox.Show("BINGO! Found at " + searchStart.Line.ToString());
    }
}

Если у вас возникнут проблемы с перехватом открытого окна, я предлагаю проверить исходный код моего расширения WordLight : есть класс WindowWatcher, который отслеживает создание текстаПросмотры.

...