繁体   English   中英

如何在Visual Studio插件中阻止OpenFile

[英]How to block on a OpenFile in a Visual Studio addin

我有一个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.在一个不那么重要的注意事项中,有没有一种方法可以像这样进行搜索而不会在“查找结果”窗格中显示结果(这会导致我的旧结果被此搜索清除,该搜索仅用于将光标移至那部分文件)?


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

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

//确保这些是类变量,否则它们可能会错误地得到GC并破坏COM交互私有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);

在那里,你会看到你想要扫描的文件(你可能需要保留一个列表等)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM