NINlabs
Code

Visual Studio Search Results, Programmatically

Chris Parnin
#code#vsx

If you want to log searches for code or perhaps wanted to provide a better UI for search results, then you need to listen to search events with a Visual Studio Addin/VSPackage.

Unfortunately, there still isn’t a direct interface for getting search results… you actually have to copy the text from the UI window…yuck.

Here is some code that does this:

First, setup the find “done” event handler.

    EnvDTE.FindEvents m_findEvents;

    protected override void Initialize()
    {
        Trace.WriteLine (string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this.ToString()));
        base.Initialize();

        var dte = (EnvDTE.DTE)GetService(typeof(EnvDTE.DTE));
        if (dte != null)
        {
           m_findEvents = dte.Events.FindEvents;
           m_findEvents.FindDone += new EnvDTE._dispFindEvents_FindDoneEventHandler(m_findEvents_FindDone);
        }
    }

Now, process the results by grabbing the find results window and copying the text in the window.

    void m_findEvents_FindDone(EnvDTE.vsFindResult Result, bool Cancelled)
    {
        var dte = (EnvDTE.DTE)GetService(typeof(EnvDTE.DTE));
        // Get search term, window location, etc...;
        var x = dte.Find.FindWhat;
        var guid = dte.Find.ResultsLocation == vsFindResultsLocation.vsFindResults1 ?
                "{0F887920-C2B6-11D2-9375-0080C747D9A0}" : "{0F887921-C2B6-11D2-9375-0080C747D9A0}";

        var findWindow = dte.Windows.Item(guid);
        var selection = findWindow.Selection as TextSelection;
        // Get search text results;
        var endPoint = selection.AnchorPoint.CreateEditPoint();
        endPoint.EndOfDocument();
        var text = endPoint.GetLines(1, endPoint.Line);
     }

References:

In order to get “Find Symbol” results, might have to use a mpf service…

← Back to Blog