Имеет ли проводник Windows интерфейс COM или .NET?

Я хочу программно управлять состоянием окна проводника (используя Matlab). В частности, я хотел бы изменить состояние окна (свернуть, развернуть, вывести на передний план), изменить папку, которая просматривается в данный момент, и, возможно, предварительно выбрать файл.

Я знаю, что могу открыть Проводник с помощью вызовов system, но я не хочу каждый раз открывать новое окно. Мне также известно об ограниченном контроле, который DDE предлагает. Но DDE ужасно устарел, еще хуже документирован, а Matlab лучше поддерживает интерфейсы COM и .NET, чем DDE.

Предоставляет ли File Explorer интерфейсы COM или .NET? Если да, то где я могу узнать о них? Особенно очень помогло бы знание PROGID File Explorer.

Я искал в Интернете, но COM и .NET не так легко найти - даже в поиске Windows Developer (лучшие результаты - это все домены, заканчивающиеся на .com и .net ...)

Обновление:

Благодаря информации, предоставленной до сих пор, я смог запустить новое окно проводника, используя

h_s = actxserver('shell.application');
h_s.Explore('c:\Users')

Но я не понимаю, как это позволит мне манипулировать окном Проводника. Насколько я понимаю из документации, объект shell.application позволяет мне взаимодействовать с оболочкой, а не с File Explorer. Я не нашел метода, позволяющего изменить выбранный файл. Кроме того, каждый раз, когда я звоню h.Explore(), открывается новое окно.

В качестве альтернативы, ковыряясь в реестре (я искал ключи в HKEY_CLASSES_ROOT, у которых есть «подключи» с именем CLSID), я нашел progID Internet Explorer, но переход к URI файла не работает. Вместо этого в окнах открывается окно Internet Explorer и новое окно File Explorer, в котором отображается неправильное местоположение.

h_e = actxserver('InternetExplorer.Application')
h_e.Navigate('file:///C:/Users') 

person Martin J.H.    schedule 28.05.2014    source источник
comment
Что ты пытаешься сделать? Оболочка Windows имеет ряд интерфейсов (и их легко найти), но нужны ли они вам, зависит от того, что вы пытаетесь сделать.   -  person xxbbcc    schedule 28.05.2014
comment
Может быть, некоторая информация здесь msdn.microsoft .com/en-us/library/windows/desktop/   -  person TGH    schedule 28.05.2014
comment
И msdn.microsoft.com /en-us/library/windows/desktop/   -  person xxbbcc    schedule 28.05.2014
comment
Спасибо вам за ссылки! Но, насколько я их понимаю, они только говорят мне, как использовать COM через уровень абстракции, предоставляемый соответствующими библиотеками C++ и заголовочными файлами. Под этим уровнем абстракции progID кажется скрытым — по крайней мере, для меня!   -  person Martin J.H.    schedule 28.05.2014
comment
Что именно вы хотите сделать? Что значит манипулировать окном проводника?   -  person Simon Mourier    schedule 29.05.2014
comment
Я хочу изменить состояние окна (свернуть, развернуть, вывести на передний план), изменить просматриваемую в данный момент папку и предварительно выбрать файл.   -  person Martin J.H.    schedule 29.05.2014


Ответы (2)


Почти два года спустя у меня была довольно похожая (хотя и менее амбициозная) цель: из Matlab я хотел записать текущие пути во всех окнах File Explorer. Код ниже работает для меня (и, возможно, может быть расширен для выполнения дополнительных манипуляций):

explorer = actxserver('Shell.Application');    
windows = explorer.Windows;
nWins = windows.Count;
for iWin = 1:nWins
    w1 = windows.Item(int32(iWin-1));    % Item is zero-based
    URL = w1.get('LocationURL');         % https://msdn.microsoft.com/en-us/library/aa752127%28v=vs.85%29.aspx
    if isequal(lower(URL(1:5)), 'file:') % File Explorer window
        if isequal(URL(6:8), '///')      % Local file
            pn = URL(9:end);
        else
            pn = URL(6:end);             % Remote file
        end
        pn = strrep(pn, '/', '\');       % I'm a Windows guy
        pn = strrep(pn, '%20', ' ');     % ...and a WYSIWYG guy
    elseif isequal(lower(URL(1:5)), 'http:')
        pn = URL;                        % Internet Explorer Window
    end
    disp(pn)
end
person Andrei V.    schedule 17.11.2015
comment
Спасибо! Используя w1.Navigate2('file:///C:/stuff'), я могу перемещаться, но максимизация/минимизация все еще не работает. Однако я могу использовать w1.get('HWND') и отправку WindowAPI на FEX для этих взаимодействий. . - person Martin J.H.; 17.11.2015
comment
@MartinJ.H., ваш обходной путь работает, но на мой вкус он показался слишком низким, поэтому я проверил, какие методы/свойства объекта w1 работают (кроме обнаруженного вами Navigate2), а какие нет. . Я обнаружил, что w1.TheaterMode = true; как бы максимизирует окно (с несколько странным видом), при условии, что окно видно (то есть не свернуто) в первую очередь. Кроме того, w1.set('Height', 600); и w1.set('Width', 800) работают для изменения размера, но только, если окно видимо. - person Andrei V.; 18.11.2015
comment
@МартинДж.Х. С другой стороны, w1.Resizable = false; или w1.Resizable = true; работают всегда, даже если окно свернуто. Кроме того, я не совсем понимаю, когда свойство можно использовать с точечной нотацией (например, Resizable), а когда нужно использовать w1.get('SomeProperty') или w1.set('SomeProperty' , значение) обозначение. Поди разберись... - person Andrei V.; 18.11.2015

Оболочка Windows имеет сотни интерфейсов для работы, и вам не нужна программа для работы с интерфейсом COM.

Однако для клиентов автоматизации (скрипты, VB и т. д.) также есть специально созданные клиенты: объекты оболочки с поддержкой сценариев, которые проще использовать для этих языков. Я полагаю, что они также неплохо работают в MatLab.

Для этих интерфейсов родоначальником всех progids является "shell.application".

person Simon Mourier    schedule 28.05.2014