从AccessibleObjectFromWindow获取对象扩展?

时间:2010-10-13 10:00:36

标签: .net interop accessibility fileinfo

我设法使用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;

任何帮助都将不胜感激!

2 个答案:

答案 0 :(得分:0)

我对SystemAccessibleObject一无所知,但为什么不从另一个角度来看待它。您知道没有扩展名的目录和文件名,因此您可以使用Directory.GetFiles并使用扩展名“查找”您的文件。

foreach (string fileName in fileNames)
{
  string[] matchedFiles = Directory.GetFiles(currentWorkingFolderPath, fileName+"*");
  etc...
}

答案 1 :(得分:0)

我还没有找到完美的解决方案,但使用剪贴板并不是一个非常糟糕的主意。