4

我有一个 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.在不太重要的一点上,有没有一种方法可以像这样进行搜索,而不会使结果最终出现在“查找结果”窗格中(这会导致我的旧结果被此搜索清除,该搜索仅用于将光标向下移动到文件的那部分)?


4

2 回答 2

11

如果 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);

然后,您将在 WindowActivated 中放入一些代码:

void WindowActivated(Window GotFocus, Window LostFocus)
        {
            Document gotFocusDoc = GotFocus.Document;
            if (gotFocusDoc != null)
            {
                string fileExt = Path.GetExtension(gotFocusDoc.Name);

在那里,您会注意要扫描的文件(您可能需要保留一个列表等)。

对于第二个问题,一旦您按照我上面建议的方式获得访问权限,您就可以自己扫描文档。

于 2010-07-19T12:50:59.687 回答
0

我认为, 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 类,它跟踪文本视图的创建。

于 2010-07-21T09:35:14.297 回答