代码之家  ›  专栏  ›  技术社区  ›  Daniel Jennings

如何在visualstudio加载项中阻止OpenFile

  •  4
  • Daniel Jennings  · 技术社区  · 14 年前

    我有一个VisualStudio2008插件,当我按下某个热键时,它会打开一个特定的文件(根据热键的上下文而不同),然后在该文件中搜索一个特定的字符串(同样,与上下文相关)。大多数情况下,这是完美的,但有时如果它打开的文件太大,搜索就会失败。

    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 回复  |  直到 12 年前
        1
  •  11
  •   WiredPrairie    14 年前

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

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

    私有WindowEvents\u winEvents=null; 专用DTE2\u应用程序对象;

    在connect中:

    _events = _applicationObject.Events;
    _winEvents = _events.get_WindowEvents();
    
    _winEvents.WindowActivated += new _dispWindowEvents_WindowActivatedEventHandler(WindowActivated);
    

    然后,在窗口中输入一些代码:

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

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

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

        2
  •  0
  •   Mikhail Nasyrov    14 年前

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