EnvDTE - 使用 C# 从 Visual Studio 中的“FindResult 1”window 获取查找文本结果

EnvDTE - Get the Find text results from 'FindResult 1" window in Visual Studio with C#

根据this post,可以Visual Studio找到。

我更新了文章中 Asif Iqbal K 的代码以消除构建错误。

public const string vsWindowKindFindResults1 = "{0F887920-C2B6-11D2-9375-0080C747D9A0}";
public string FindInFiles(string searchText)
{
    EnvDTE80.DTE2 dte;
    dte = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE");
    dte.MainWindow.Activate();
    EnvDTE.Find find = dte.Find;
    find.Action = EnvDTE.vsFindAction.vsFindActionFindAll;
    find.FindWhat = searchText;
    find.MatchWholeWord = false;
    find.ResultsLocation = EnvDTE.vsFindResultsLocation.vsFindResults1;
    find.Target = EnvDTE.vsFindTarget.vsFindTargetSolution;
    find.PatternSyntax = EnvDTE.vsFindPatternSyntax.vsFindPatternSyntaxRegExpr;
    find.SearchSubfolders = true;
    var x = dte.Find.FindWhat;
    EnvDTE.vsFindResult result = find.Execute();
    var findWindow = dte.Windows.Item(vsWindowKindFindResults1);
    string data = "";

    System.Threading.Thread.Sleep(5000);//Comment out this code to see the problem, this line of code is not the solution though.

    if (result == EnvDTE.vsFindResult.vsFindResultFound)
    {
        var selection = findWindow.Selection as EnvDTE.TextSelection;
        selection.SelectAll();
        data = selection.Text;
    }
    return data;
}

我看到问题是函数 return 字符串(字符串数据)太早了,所以它无法从结果 window.

中获取所有文本

因此代码非常接近于获取查找文本。剩下的一个难题是检查查找过程是否完成,然后获取文本。

所以问题是:用代码

替换什么代码
System.Threading.Thread.Sleep(5000);

以便函数 FindInFiles() 可以获取 'FindResult 1' 的所有文本 window。

感谢阅读。

这是解决方案

    EnvDTE80.DTE2 s_dte;
    EnvDTE.FindEvents s_findEvents;
    public const string vsWindowKindFindResults1 = "{0F887920-C2B6-11D2-9375-0080C747D9A0}";

    public frmFindHelper()
    {
        InitializeComponent();

        s_dte = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE");
        s_dte.MainWindow.Activate();
        s_findEvents = s_dte.Events.FindEvents;
        s_findEvents.FindDone += new EnvDTE._dispFindEvents_FindDoneEventHandler(OnFindDone);
    }

    private void OnFindDone(EnvDTE.vsFindResult result, bool cancelled)
    {
        if (result == EnvDTE.vsFindResult.vsFindResultFound)
        {
            var findWindow = s_dte.Windows.Item(vsWindowKindFindResults1);
            string data = "";
            var selection = findWindow.Selection as EnvDTE.TextSelection;
            selection.SelectAll();
            data = selection.Text;
            MessageBox.Show("Done!");
        }
    }

    private void btnFind_Click(object sender, EventArgs e)
    {
        EnvDTE.Find find = s_dte.Find;
        find.Action = EnvDTE.vsFindAction.vsFindActionFindAll;
        find.FindWhat = txtSearch.Text;
        find.MatchWholeWord = false;
        find.ResultsLocation = EnvDTE.vsFindResultsLocation.vsFindResults1;
        find.Target = EnvDTE.vsFindTarget.vsFindTargetSolution;
        find.PatternSyntax = EnvDTE.vsFindPatternSyntax.vsFindPatternSyntaxRegExpr;
        find.SearchSubfolders = true;
        var x = s_dte.Find.FindWhat;
        EnvDTE.vsFindResult result = find.Execute();
    }

感谢来自 this post

的 Ed Dore