我们在使用电脑时,资源管理器是常用的工具。但你是否真正清楚它所具备的强大功能?无论是查看资源还是对资源进行管理,它都扮演着至关重要的角色。
资源管理器的访问方式
#define _WIN32_WINNT 0x0600
#define _WIN32_IE 0x0700
#define _UNICODE
#include
#include
#include
#include
#include
#include
#pragma comment(lib, "shlwapi.lib")
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "shell32.lib")
#pragma comment(lib, "propsys.lib")
// Use the Shell Windows object to find all of the explorer and IExplorer
// windows and close them.
void CloseExplorerWindows()
{
IShellWindows* psw;
if (SUCCEEDED(CoCreateInstance(CLSID_ShellWindows,
NULL,
CLSCTX_LOCAL_SERVER,
IID_PPV_ARGS(&psw))))
{
VARIANT v = { VT_I4 };
if (SUCCEEDED(psw->get_Count(&v.lVal)))
{
// Walk backward to make sure that the windows that close
// do not cause the array to be reordered.
while (--v.lVal >= 0)
{
IDispatch *pdisp;
if (S_OK == psw->Item(v, &pdisp))
{
IWebBrowser2 *pwb;
if (SUCCEEDED(pdisp->QueryInterface(IID_PPV_ARGS(&pwb))))
{
pwb->Quit();
pwb->Release();
}
pdisp->Release();
}
}
}
psw->Release();
}
}
// Convert an IShellItem or IDataObject into a VARIANT that holds an IDList
// suitable for use with IWebBrowser2::Navigate2.
HRESULT InitVariantFromObject(IUnknown *punk, VARIANT *pvar)
{
VariantInit(pvar);
PIDLIST_ABSOLUTE pidl;
HRESULT hr = SHGetIDListFromObject(punk, &pidl);
if (SUCCEEDED(hr))
{
hr = InitVariantFromBuffer(pidl, ILGetSize(pidl), pvar);
CoTaskMemFree(pidl);
}
return hr;
}
HRESULT ParseItemAsVariant(PCWSTR pszItem, IBindCtx *pbc, VARIANT *pvar)
{
VariantInit(pvar);
IShellItem *psi;
HRESULT hr = SHCreateItemFromParsingName(pszItem, NULL, IID_PPV_ARGS(&psi));
if (SUCCEEDED(hr))
{
hr = InitVariantFromObject(psi, pvar);
psi->Release();
}
return hr;
}
HRESULT GetKnownFolderAsVariant(REFKNOWNFOLDERID kfid, VARIANT *pvar)
{
VariantInit(pvar);
PIDLIST_ABSOLUTE pidl;
HRESULT hr = SHGetKnownFolderIDList(kfid, 0, NULL, &pidl);
if (SUCCEEDED(hr))
{
hr = InitVariantFromBuffer(pidl, ILGetSize(pidl), pvar);
CoTaskMemFree(pidl);
}
return hr;
}
HRESULT GetShellItemFromCommandLine(REFIID riid, void **ppv)
{
*ppv = NULL;
HRESULT hr = E_FAIL;
int cArgs;
PWSTR *ppszCmd = CommandLineToArgvW(GetCommandLineW(), &cArgs);
if (ppszCmd && cArgs > 1)
{
WCHAR szSpec[MAX_PATH];
StringCchCopyW(szSpec, ARRAYSIZE(szSpec), ppszCmd[1]);
PathUnquoteSpacesW(szSpec);
hr = szSpec[0] ? S_OK : E_FAIL; // Protect against empty data
if (SUCCEEDED(hr))
{
hr = SHCreateItemFromParsingName(szSpec, NULL, riid, ppv);
if (FAILED(hr))
{
WCHAR szFolder[MAX_PATH];
GetCurrentDirectoryW(ARRAYSIZE(szFolder), szFolder);
hr = PathAppendW(szFolder, szSpec) ? S_OK : E_FAIL;
if (SUCCEEDED(hr))
{
hr = SHCreateItemFromParsingName(szFolder, NULL, riid, ppv);
}
}
}
}
return hr;
}
HRESULT GetShellItemFromCommandLineAsVariant(VARIANT *pvar)
{
VariantInit(pvar);
IShellItem *psi;
HRESULT hr = GetShellItemFromCommandLine(IID_PPV_ARGS(&psi));
if (SUCCEEDED(hr))
{
hr = InitVariantFromObject(psi, pvar);
psi->Release();
}
return hr;
}
void OpenWindow()
{
IWebBrowser2 *pwb;
HRESULT hr = CoCreateInstance(CLSID_ShellBrowserWindow,
NULL,
CLSCTX_LOCAL_SERVER,
IID_PPV_ARGS(&pwb));
if (SUCCEEDED(hr))
{
CoAllowSetForegroundWindow(pwb, 0);
pwb->put_Left(100);
pwb->put_Top(100);
pwb->put_Height(600);
pwb->put_Width(800);
VARIANT varTarget = {0};
hr = GetShellItemFromCommandLineAsVariant(&varTarget);
if (FAILED(hr))
{
hr = GetKnownFolderAsVariant(FOLDERID_UsersFiles, &varTarget);
}
if (SUCCEEDED(hr))
{
VARIANT vEmpty = {0};
hr = pwb->Navigate2(&varTarget, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
if (SUCCEEDED(hr))
{
pwb->put_Visible(VARIANT_TRUE);
}
VariantClear(&varTarget);
}
pwb->Release();
}
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
if (SUCCEEDED(hr))
{
CloseExplorerWindows();
OpenWindow();
CoUninitialize();
}
return 0;
}
在电脑系统中,我们可以将资源管理器以.exe文件或接口的形式整合使用。比如在Windows中,找到资源管理器的.exe文件并点击,就能启动它。而且,通过x等函数,资源管理器.exe还能独立创建进程。不管从哪个方面看,这些访问和启动方法都让用户操作资源管理器变得灵活。此外,通过特定代码,我们还能编程打开资源管理器窗口,甚至创建新的实例,这给开发者等特定用户带来了极大便利。
资源管理的自动化模型
资源管理器的自动模式至关重要。比如,示例代码揭示了如何使用该模式来生成和识别活跃的资源管理器窗口。此模式在众多软件项目和系统操作中均能产生显著效益。此外,开发者可通过接口管理资源管理器的工作空间,以此优化开发流程,提升工作效率。这种自动化的便捷性,是众多开发项目高效推进的关键因素。
Vista及更高版中的标准组件
资源管理器和命名空间树控件是Vista及以上版本的标准配置。这两个组件应用广泛。开发者可利用这些接口来构建新组件,从而有效降低开发成本。此外,它们常被用于打造针对特定问题域的定制化资源管理器。这显示了它们的灵活与可扩展性,能够适应不同场景和需求,满足用户对资源管理的个性化需求。
导航控件的功能
资源管理器中,导航控件至关重要。它能协助用户明确操作范围,并在页面空间内进行导航。比如,在Shell命名空间页面空间里,用户点击痕迹导航按钮即可跳转至上级页面。此外,用户还可以输入网址或路径来指定导航路径。这些功能让用户有更多浏览资源的方式,提升了浏览效率。同时,它还提供了优化后的树控件新版本和Web风格的按钮,便于相对导航,非常实用高效。
命令控件的作用
命令控件主要向用户展示资源管理器的各项功能。资源管理器通过命令控件来执行常规操作或特定选项的功能。例如,显示常用命令的按钮是命令工具栏的最新版本。这个工具栏提供了丰富的自定义选项,比如下拉按钮等。工具栏中央还设有一个可自定义的单个控件。此外,还有一个子集,它会根据右键点击的项目显示相应的可用命令上下文。这些设计使得用户能更便捷、高效地使用资源管理器。
其他控件及其协同工作
属性和预览控件各有其特定功能。它们能用于预览项目,查看或修改项目属性。在面临多个选项时,还能提供所选项目组的属性概览。若未作选择,则会展示当前页面的属性。筛选和视图控件在资源管理器中操作项目集,可改变项目显示方式。这些控件功能相互依存。尽管部分控件与其它命名空间的标准控件名称或功能相似,实则属于不同类别。它们主要通过用户操作或自身事件进行协作。这一切都显示了资源管理器中各控件间的紧密联系。
你是否曾在资源管理器中遇到难以理解的功能?欢迎在评论区分享你的想法。觉得文章对你有帮助的话,不妨点个赞并转发一下。