namespace SinMaiLauncher.Interops { using System.Diagnostics; using System.Text; using Vanara.Extensions; using Vanara.PInvoke; using static Vanara.PInvoke.Shell32; using IServiceProvider = Vanara.PInvoke.Shell32.IServiceProvider; public static class ExplorerInterops { private static readonly Guid SID_STopLevelBrowser = new("4C96BE40-915C-11CF-99D3-00AA004AE837"); internal static ILogger? logger = null; static ExplorerInterops() { Ole32.CoInitializeEx(IntPtr.Zero, Ole32.COINIT.COINIT_APARTMENTTHREADED); } public static string[] GetOpenWindows() { var shellWindows = new SHDocVw.ShellWindows(); var lst = new List(); foreach (var window in shellWindows) { try { var svcProvider = (IServiceProvider)window; var shellBrowser = svcProvider.QueryService(SID_STopLevelBrowser); IShellView? shellView = null; shellBrowser?.QueryActiveShellView(out shellView); object qiFolderView = null; shellView?.QueryInterface(typeof(IFolderView).GUID, out qiFolderView); var fv = (IFolderView)qiFolderView; var objPf = fv?.GetFolder(typeof(IPersistFolder2).GUID); var pf2 = (IPersistFolder2)objPf; var pIdl = PIDL.Null;// new(""); pf2?.GetCurFolder(ref pIdl); var sb = new StringBuilder(260); if (SHGetPathFromIDList(pIdl, sb)) { lst.Add(sb.ToString()); } else { //var so1 = SHGetNameFromIDList(pidl, SIGDN.SIGDN_NORMALDISPLAY, out var name); var so2 = SHGetNameFromIDList(pIdl, SIGDN.SIGDN_DESKTOPABSOLUTEPARSING, out var clsid); if (so2.Succeeded) lst.Add(clsid); } pIdl.Dispose(); } catch (Exception e) { var breakPoint = 0; } } return lst.ToArray(); } public static void KillExplorer() { try { Process.Start(new ProcessStartInfo { FileName = "taskkill", Arguments = "/f /im explorer.exe", CreateNoWindow = true, // 不显示命令行窗口 UseShellExecute = false // 不需要 Shell 执行 })?.WaitForExit(); } catch (Exception) { var breakPoint = 0; } } public static void RestoreExplorer() => Process.Start("explorer.exe"); public static void OpenWindow(IReadOnlyList pathOrClsid) { logger?.LogInformation($"Restore explorer total: {pathOrClsid.Count}"); for (var index = 0; index < pathOrClsid.Count; index++) { var poc = pathOrClsid[index]; try { logger?.LogInformation($"Restore explorer[{index}]: {poc}"); Process.Start(new ProcessStartInfo { FileName = "explorer.exe", Arguments = $"\"{poc}\"", // 支持路径或 CLSID UseShellExecute = true }); } catch (Exception) { var breakPoint = 0; } } } } }