【问题标题】:Does Windows File Explorer have a COM or .NET interface?Windows 文件资源管理器是否有 COM 或 .NET 接口?
【发布时间】:2014-05-28 15:29:21
【问题描述】:

我想以编程方式控制文件资源管理器窗口的状态(使用 Matlab)。具体来说,我想更改窗口状态(最小化、最大化、弹出到前台),更改当前查看的文件夹,并可能预选一个文件。

我知道我可以通过system 调用打开文件资源管理器,但我不想每次都打开一个新窗口。我也知道DDE 提供的limited control。但是 DDE 已经过时了,文档记录更差,而且 Matlab 对 COM 和 .NET 接口的支持比 DDE 更好。

文件资源管理器是否公开 COM 或 .NET 接口?如果是这样,我在哪里可以找到有关它们的信息?尤其是知道文件资源管理器的 PROGID 会有很大帮助。

我在网上搜索过,但 COM 和 .NET 不容易搜索 - 甚至在 Windows 开发人员搜索中也搜索不到(排名靠前的结果都是以 .com 和 .net 结尾的域...)

更新:

感谢目前提供的信息,我能够使用以下方法启动新的资源管理器窗口

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

但我看不出这将如何让我操纵资源管理器窗口。据我了解文档,shell.application 对象允许我与 shell 交互,而不是与文件资源管理器交互。我没有找到允许我更改所选文件的方法。另外,每次我拨打h.Explore(),都会打开一个新窗口。

作为替代方法,通过查看注册表(我在 HKEY_CLASSES_ROOT 中查找具有称为 CLSID 的“子键”的键),我找到了 Internet Explorer 的 progID,但导航到文件 URI 不起作用。相反,I windows 会打开一个 Internet Explorer 窗口和一个显示错误位置的新文件资源管理器窗口。

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

【问题讨论】:

  • 你想做什么? Windows Shell 有许多界面(而且它们很容易搜索),但是否需要它们取决于您要做什么。
  • 感谢您的链接!但据我了解,它们只是通过相应的 C++ 库和头文件提供的抽象层告诉我如何使用 COM。在这个抽象层下,progID 似乎是隐藏的——至少对我来说是这样!
  • 你到底想做什么? “操纵资源管理器窗口”是什么意思?

标签: .net matlab com windows-explorer


【解决方案1】:

Windows Shell 有数百个接口可供使用,您无需 progid 即可使用 COM 接口。

但是,对于自动化客户端(脚本、VB 等),它也有特制的客户端:Scriptable Shell Objects,更易于用于这些语言。我想它们在 MatLab 中也能很好地工作。

对于这些接口,所有 progid 之母是“shell.application”。

【讨论】:

    【解决方案2】:

    大约两年后,我有了一个非常相似(如果不那么雄心勃勃)的目标:我想在 Matlab 中记录所有文件资源管理器窗口中的当前路径。下面的代码对我有用(也许可以扩展以进行额外的操作):

    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
    

    【讨论】:

    • 谢谢!使用w1.Navigate2('file:///C:/stuff') 我可以导航,但最大化/最小化仍然不起作用。但是,我可以使用w1.get('HWND')WindowAPI submission on the FEX 进行这些交互。
    • @MartinJ.H.,您的解决方法可以完成这项工作,但它似乎对我的口味来说有点太低了,所以我测试了 w1 对象的哪些方法/属性似乎有效(除了 Navigate2 之外你发现了),哪个没有。我发现w1.TheaterMode = true; 会最大化窗口(看起来有点奇怪),前提是窗口首先是可见的(即未最小化)。此外,w1.set('Height', 600);w1.set('Width', 800) 可用于调整大小,但在窗口可见的情况下。
    • @MartinJ.H.另一方面,w1.Resizable = false;w1.Resizable = true; 始终有效,即使窗口已最小化。最重要的是,我不太明白何时可以将属性与点表示法一起使用(如 Resizable),以及何时必须使用 w1.get('SomeProperty') 或 w1.set('SomeProperty' , value) notation.Go figure ...
    猜你喜欢
    • 2020-08-28
    • 2011-02-22
    • 2010-12-30
    • 2010-09-24
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多