c# everthing.exe 通信

1 获取everthing进程  调用 Everything 搜索创建SearchWithEverything函数

using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.IO;
using System.Management;
using System.Text;

class EverythingHelper
{
    // 方法 1:从进程获取路径
    public static string GetEverythingPathFromRunningProcess()
    {
        Process[] processes = Process.GetProcessesByName("Everything");
        if (processes.Length == 0)
        {
            return null; // Everything 未运行
        }

        try
        {
            return processes[0].MainModule.FileName;
        }
        catch
        {
            return null; // 权限不足
        }
    }

    // 方法 2:从 WMI 获取路径(更可靠)
    public static string GetEverythingPathFromWMI()
    {
        string query = "SELECT ExecutablePath FROM Win32_Process WHERE Name = 'Everything.exe'";
        try
        {
            using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
            using (ManagementObjectCollection results = searcher.Get())
            {
                if (results.Count == 0) return null;

                foreach (ManagementObject process in results)
                {
                    try
                    {
                        object pathObj = process["ExecutablePath"];
                        if (pathObj != null)
                        {
                            string exePath = pathObj.ToString();
                            if (!string.IsNullOrWhiteSpace(exePath) && File.Exists(exePath))
                            {
                                return exePath;
                            }
                        }
                    }
                    catch (ManagementException ex)
                    {
                        // 记录错误或忽略(权限不足等)
                        Debug.WriteLine($"WMI Access Error: {ex.Message}");
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine($"WMI Query Failed: {ex.Message}");
        }
        return null;
    }

    // 方法 3:从注册表获取
    public static string GetEverythingPathFromRegistry()
    {
        using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Everything"))
        {
            if (key != null)
            {
                object installLocationObj = key.GetValue("InstallLocation");
                string installLocation = installLocationObj?.ToString(); // 安全转换
                if (!string.IsNullOrEmpty(installLocation))
                {
                    string exePath = Path.Combine(installLocation, "Everything.exe");
                    if (File.Exists(exePath)) return exePath;
                }
            }
        }
        return null;
    }
    // 获取 Everything 选中的文件和目录列表
    // 版本检测:需要 Everything 1.4.1+
    public static bool CheckEverythingVersion()
    {
        try
        {
            string exePath = FindEverythingExe();
            var versionInfo = FileVersionInfo.GetVersionInfo(exePath);
            return versionInfo.FileMajorPart > 1 ||
                  (versionInfo.FileMajorPart == 1 && versionInfo.FileMinorPart >= 4);
        }
        catch
        {
            return false;
        }
    }

    // 增强版获取选中项(带状态反馈)
    public static (List<string> items, string message) GetSelectedItemsWithStatus()
    {
        try
        {
            // 检查 Everything 是否运行
            if (Process.GetProcessesByName("Everything").Length == 0)
                return (new List<string>(), "Everything 未运行");

            if (!CheckEverythingVersion())
                return (new List<string>(), "需要 Everything 1.4.1 或更高版本");

            var items = new List<string>();
            string exePath = FindEverythingExe();

            using (Process process = new Process())
            {
                process.StartInfo = new ProcessStartInfo
                {
                    FileName = exePath,
                    Arguments = "-export-selected-items-to-stdout",
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                    CreateNoWindow = true,
                    StandardOutputEncoding = Encoding.UTF8
                };

                process.Start();

                // 异步读取输出
                while (!process.StandardOutput.EndOfStream)
                {
                    string line = process.StandardOutput.ReadLine()?.Trim();
                    if (!string.IsNullOrEmpty(line) && (File.Exists(line) || Directory.Exists(line)))
                    {
                        items.Add(line);
                    }
                }

                if (!process.WaitForExit(3000)) // 最多等待3秒
                {
                    process.Kill();
                    return (items, $"获取超时,已找到 {items.Count} 个有效项");
                }
            }

            return items.Count > 0
                ? (items, $"成功获取 {items.Count} 个选中项")
                : (items, "Everything 中没有选中的有效文件/目录");
        }
        catch (Exception ex)
        {
            return (new List<string>(), $"获取失败: {ex.Message}");
        }
    }

    // 显示选中项在 RichTextBox(带格式)
    public static void DisplaySelectedItems(RichTextBox box)
    {
        var (items, status) = GetSelectedItemsWithStatus();

        box.Clear();
        box.SelectionColor = Color.Blue;
        box.AppendText(status + "\n\n");

        for (int i = 0; i < items.Count; i++)
        {
            // 序号
            box.SelectionColor = Color.Green;
            box.AppendText($"{i + 1}. ");

            // 路径类型
            bool isDir = Directory.Exists(items[i]);
            box.SelectionColor = isDir ? Color.Orange : Color.Black;
            box.AppendText(isDir ? "[目录] " : "[文件] ");

            // 路径
            box.SelectionColor = Color.Black;
            box.AppendText(items[i] + "\n");
        }
    }
    // 综合查找
    public static string FindEverythingExe()
    {
        // 1. 尝试从运行进程获取
        string exePath = GetEverythingPathFromWMI() ?? GetEverythingPathFromRunningProcess();
        if (exePath != null) return exePath;

        // 2. 尝试从注册表获取
        exePath = GetEverythingPathFromRegistry();
        if (exePath != null) return exePath;

        // 3. 尝试默认路径
        string[] commonPaths =
        {
            @"C:\Program Files\Everything\Everything.exe",
            @"C:\Program Files (x86)\Everything\Everything.exe",
            Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Everything", "Everything.exe")
        };

        foreach (string path in commonPaths)
        {
            if (File.Exists(path)) return path;
        }

        // 4. 让用户手动选择
        OpenFileDialog openFileDialog = new OpenFileDialog
        {
            Title = "请选择 Everything.exe",
            Filter = "Everything.exe|Everything.exe|所有文件 (*.*)|*.*",
            InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
        };

        if (openFileDialog.ShowDialog() == DialogResult.OK)  // 不是 true,而是 DialogResult.OK
        {
            return openFileDialog.FileName;
        }

        throw new FileNotFoundException("未找到 Everything.exe。");
    }

    // 调用 Everything 搜索
    public static void SearchWithEverything(string query)
    {
        string everythingExe = FindEverythingExe();
        Process.Start(everythingExe, $"-s \"{query}\"");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值