mirror of
https://github.com/fofolee/uTools-quickcommand.git
synced 2025-06-08 22:51:25 +08:00
162 lines
3.9 KiB
C#
162 lines
3.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Web.Script.Serialization;
|
|
|
|
public class ExplorerManager
|
|
{
|
|
public static void Main(string[] args)
|
|
{
|
|
if (args.Length == 0 || args[0] == "-h" || args[0] == "--help")
|
|
{
|
|
ShowHelp();
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
string type = GetArgumentValue(args, "-type");
|
|
if (string.IsNullOrEmpty(type))
|
|
{
|
|
throw new Exception("必须指定操作类型 (-type)");
|
|
}
|
|
|
|
switch (type.ToLower())
|
|
{
|
|
case "list":
|
|
ListExplorerWindows();
|
|
break;
|
|
|
|
case "navigate":
|
|
string handle = GetArgumentValue(args, "-handle");
|
|
string path = GetArgumentValue(args, "-path");
|
|
if (string.IsNullOrEmpty(handle) || string.IsNullOrEmpty(path))
|
|
{
|
|
throw new Exception("必须指定窗口句柄和目标路径");
|
|
}
|
|
NavigateToPath(long.Parse(handle), path);
|
|
break;
|
|
|
|
default:
|
|
throw new Exception(string.Format("不支持的操作类型: {0}", type));
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.Error.WriteLine(string.Format("Error: {0}", ex.Message));
|
|
}
|
|
}
|
|
|
|
private static void ListExplorerWindows()
|
|
{
|
|
var explorerWindows = new List<Dictionary<string, object>>();
|
|
|
|
try
|
|
{
|
|
dynamic shellApp = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));
|
|
dynamic windows = shellApp.Windows();
|
|
|
|
foreach (dynamic window in windows)
|
|
{
|
|
try
|
|
{
|
|
string locationUrl = window.LocationURL;
|
|
if (string.IsNullOrEmpty(locationUrl)) continue;
|
|
|
|
string path = new Uri(locationUrl).LocalPath;
|
|
explorerWindows.Add(new Dictionary<string, object>
|
|
{
|
|
{ "handle", window.HWND },
|
|
{ "title", window.LocationName },
|
|
{ "path", path },
|
|
{ "class", "CabinetWClass" }
|
|
});
|
|
}
|
|
catch
|
|
{
|
|
// 忽略获取信息失败的窗口
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.Error.WriteLine(string.Format("Error: {0}", ex.Message));
|
|
return;
|
|
}
|
|
|
|
var serializer = new JavaScriptSerializer();
|
|
Console.WriteLine(serializer.Serialize(explorerWindows));
|
|
}
|
|
|
|
private static void NavigateToPath(long handle, string path)
|
|
{
|
|
try
|
|
{
|
|
dynamic shellApp = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));
|
|
dynamic windows = shellApp.Windows();
|
|
|
|
foreach (dynamic window in windows)
|
|
{
|
|
try
|
|
{
|
|
if (window.HWND == handle)
|
|
{
|
|
window.Navigate(path);
|
|
Console.WriteLine("true");
|
|
return;
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
// 忽略单个窗口的错误
|
|
}
|
|
}
|
|
throw new Exception("未找到指定的窗口");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new Exception(string.Format("导航失败: {0}", ex.Message));
|
|
}
|
|
}
|
|
|
|
private static string GetArgumentValue(string[] args, string key)
|
|
{
|
|
int index = Array.IndexOf(args, key);
|
|
if (index >= 0 && index < args.Length - 1)
|
|
{
|
|
return args[index + 1];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private static void ShowHelp()
|
|
{
|
|
Console.WriteLine(@"
|
|
Windows 资源管理器工具使用说明
|
|
==========================
|
|
|
|
基本语法:
|
|
explorer.exe -type <操作类型> [参数...]
|
|
|
|
操作类型:
|
|
--------
|
|
1. list - 列出所有打开的资源管理器窗口
|
|
2. navigate - 导航到指定路径
|
|
参数:
|
|
-handle 窗口句柄
|
|
-path 目标路径
|
|
|
|
返回值:
|
|
------
|
|
list: JSON格式的窗口信息数组
|
|
navigate: true表示成功
|
|
|
|
使用示例:
|
|
--------
|
|
1. 列出所有资源管理器窗口:
|
|
explorer.exe -type list
|
|
2. 导航到指定路径:
|
|
explorer.exe -type navigate -handle 12345 -path ""C:\Windows""
|
|
");
|
|
}
|
|
}
|