Получить расширение объекта из AccessibleObjectFromWindow? - PullRequest
0 голосов
/ 13 октября 2010

Мне удалось получить выбранный файл в текущей рабочей папке из проводника Windows, используя SystemAccessibleObject из http://mwinapi.sourceforge.net/

Я хочу получить имя файла с расширением, но если вы включите «Скрыть расширения для известных типов файлов»тогда будет только имя файла.Я застрял на этом шаге.

Мой код:

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 голосов
/ 05 ноября 2010

Я еще не нашел идеальное решение, но использование буфера обмена - неплохая идея.

0 голосов
/ 13 октября 2010

Я ничего не знаю о SystemAccessibleObject, но почему бы не подойти к этому под другим углом.Вы знаете каталог и имя файла без расширения, поэтому вы можете использовать Directory.GetFiles и «найти» ваш файл с расширением.

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