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}\"");}
}