我设法使用http://mwinapi.sourceforge.net/中的SystemAccessibleObject从Windows资源管理器中获取当前工作文件夹中的选定文件
我想获取带扩展名的文件名,但如果启用“隐藏已知文件类型的扩展名”,那么将只有文件名。我坚持这一步。
我的代码:
SystemAccessibleObject currentWorkingWindow = SystemAccessibleObject.FromWindow(new SystemWindow(GetForegroundWindow()), AccessibleObjectID.OBJID_WINDOW).Children.Where(c => c.RoleString.Equals("client")).FirstOrDefault();
if (null != currentWorkingWindow)
{
SystemWindow addressBar = currentWorkingWindow.Window.AllDescendantWindows.Where(w => w.ClassName.Equals("ComboBox")).FirstOrDefault();
if (null != addressBar)
{
string addressBarContent = addressBar.Content.LongDescription;
Match m = Regex.Match(addressBarContent, "Address \\[push button\\]\\n[A-Z]: \\n[A-Z]: ([A-Z]:\\\\[^/:*?<>|\"\\r\\n\\t]+)");
if (null != m || null != m.Groups[1])
{
SystemWindow currentListView = currentWorkingWindow.Window.AllDescendantWindows.Where(w => w.ClassName.Equals("SysListView32")).FirstOrDefault();
if (null != currentListView)
{
SystemAccessibleObject currentListViewItems = SystemAccessibleObject.FromWindow(currentListView, AccessibleObjectID.OBJID_WINDOW).Children.Where(c => c.RoleString.Equals("list")).FirstOrDefault();
if (null != currentListViewItems)
{
SystemAccessibleObject[] selectedItems = currentListViewItems.SelectedObjects;
string currentWorkingFolderPath = m.Groups[1].Value;
if (0 != selectedItems.Count())
{
string[] fileNames = currentListView.Content.PropertyList.Select(p => p.Value).ToArray();
}
}
}
currentListView = null;
}
m = null;
}
addressBar = null;
}
currentWorkingWindow = null;
任何帮助都将不胜感激!
答案 0 :(得分:0)
我对SystemAccessibleObject一无所知,但为什么不从另一个角度来看待它。您知道没有扩展名的目录和文件名,因此您可以使用Directory.GetFiles并使用扩展名“查找”您的文件。
foreach (string fileName in fileNames)
{
string[] matchedFiles = Directory.GetFiles(currentWorkingFolderPath, fileName+"*");
etc...
}
答案 1 :(得分:0)
我还没有找到完美的解决方案,但使用剪贴板并不是一个非常糟糕的主意。