如何在Visual Studio插件中阻止打开文件

时间:2010-07-12 21:32:00

标签: c# visual-studio-2008 visual-studio-addins envdte

我有一个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 个答案:

答案 0 :(得分:11)

如果OpenFile异步运行,我建议您考虑更改逻辑以依赖于另一个依赖于正在激活的文档的事件。

例如,您是否尝试使用快捷键触发OpenFile,然后对搜索进行排队,以便稍后由VS事件处理? (下面的代码取自Visual Studio 2010插件,但我相信事件是相同的。)

//确保这些是类变量,否则它们可能会错误地导致GC并破坏COM交互         private WindowEvents _winEvents = null;         private 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);

在那里,您需要查看要扫描的文件(您可能需要保留列表等)。

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

答案 1 :(得分: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类,用于跟踪文本视图的创建。