【问题标题】:EnvDTE - Get the Find text results from 'FindResult 1" window in Visual Studio with C#EnvDTE - 使用 C# 从 Visual Studio 中的“FindResult 1”窗口获取查找文本结果
【发布时间】:2025-12-18 14:25:01
【问题描述】:

根据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;
}

我看到问题是函数返回字符串(字符串数据)太早,所以它无法从结果窗口中获取所有文本。

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

所以问题是:用代码替换什么代码

System.Threading.Thread.Sleep(5000);

这样函数FindInFiles()就可以得到'FindResult 1'窗口的所有文本。

感谢阅读。

【问题讨论】:

    标签: c# visual-studio envdte


    【解决方案1】:

    解决办法

        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

    【讨论】: