如何实现研究,并在命名空间扩展中打开本页概要
在创建一个具有多个级别的文件夹的命名空间扩展时,可能需要实现资源管理器并从上下文菜单打开命令。
本文讨论
如何实现Windows 资源管理器树中的资源管理器,并从上下文菜单打开命令。 本文假定您已熟悉的命名空间扩展的 开发。 编写命名空间扩展的其他信息,请参阅在 7 月份,1996年问题,Microsoft 系统日志的 David 斌文章"扩展 Windows 资源管理器的名称空间扩展"。 更多信息
当您想要实施资源管理器和从外壳程序视图打开命令时,通常将调用 IShellBrowser::BrowseObject,指定所需
的命令的正确选项。 但是,您不能这样做,您在 Windows 资源管理器树中的文件夹项目因为 IShellBrowser接口 并不总是可以使用。 幸运的是,您可以实现这些命令,使用 ShellExecuteEx 和 shell 文件夹和外壳视图实现可以 使用这些命令。 如果您想要实现 Windows 资源管理器树中项目的上下文菜单中的资源管理器和打开命令,首先必须这些项在菜单 中添加您 IContextMenu::QueryContextMenu。 因为在处理执行命令,您可以提供任何所需的菜单项的命令 ID。 请记住应使用其他语言的本地化的资源管理器和打开菜单字符串。 第一个难题是如何确定哪一项都应该是默认项目。 通常情况下,如果在浏览模式 (其中包含一个树窗口) 中显示 该项目,则资源管理器命令将是默认设置。 打开模式 (不存在的树) 中显示该项目,然后打开在上下文菜单中的 默认项目。 如果从资源管理器模式窗口外壳由生成的上下文菜单,它将设置 CMF_EXPLORE 标志时,它调用您的 IContextMenu::QueryContextMenu。 如果设置了此标志,您应该使资源管理器的第一个和默认项目的菜单中。 如果未设置此标志,然后才可将打开第一个和默认项。 示例代码
#define IDM_EXPLORE 0 #define IDM_OPEN 1 #define IDM_LAST IDM_OPEN STDMETHODIMP CContextMenu::QueryContextMenu( HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) { if(!(CMF_DEFAULTONLY & uFlags)) { MENUITEMINFO mii; if(uFlags & CMF_EXPLORE) { //add the Explore command first and make it the default item ZeroMemory(&mii, sizeof(mii)); mii.cbSize = sizeof(mii); mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; mii.wID = idCmdFirst + IDM_EXPLORE; mii.fType = MFT_STRING; mii.dwTypeData = TEXT("&Explore"); mii.fState = MFS_ENABLED | MFS_DEFAULT; InsertMenuItem( hMenu, indexMenu++, TRUE, &mii); ZeroMemory(&mii, sizeof(mii)); mii.cbSize = sizeof(mii); mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; mii.wID = idCmdFirst + IDM_OPEN; mii.fType = MFT_STRING; mii.dwTypeData = TEXT("&Open"); mii.fState = MFS_ENABLED; InsertMenuItem( hMenu, indexMenu++, TRUE, &mii); } else { //add the Open command first and make it the default item ZeroMemory(&mii, sizeof(mii)); mii.cbSize = sizeof(mii); mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; mii.wID = idCmdFirst + IDM_OPEN; mii.fType = MFT_STRING; mii.dwTypeData = TEXT("&Open"); mii.fState = MFS_ENABLED | MFS_DEFAULT; InsertMenuItem( hMenu, indexMenu++, TRUE, &mii); ZeroMemory(&mii, sizeof(mii)); mii.cbSize = sizeof(mii); mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; mii.wID = idCmdFirst + IDM_EXPLORE; mii.fType = MFT_STRING; mii.dwTypeData = TEXT("&Explore"); mii.fState = MFS_ENABLED; InsertMenuItem( hMenu, indexMenu++, TRUE, &mii); } return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(IDM_LAST + 1)); } return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(0)); } FCW_TREE。 如果此方法返回 NULL,视图处于打开的模式。 如果此方法返回一个非空值,该视图是在浏览模式中。 当需要显示项目的上下文菜单的视图时,它可以然后获取使用其父 IShellFolder::GetUIObjectOf 的 IContextMenu 对象, 然后调用 IContextMenu 对象的 QueryContextMenu 方法。 如果存在该树,视图应 QueryContextMenu 调用中添加 CMF_EXPLORE 标志。 示例代码下面是一个示例,获取视图中的指定项目的上下文菜单。 此视图对象会保留在 m_pSFParent 中创建该文件夹的IShellFolder 接口。
#define MENU_OFFSET 1 #define MENU_MAX 100 HMENU CShellView::GetContextMenuForItems( UINT uItems, LPITEMIDLIST *aItems) { HMENU hMenu; if(aItems) { LPCONTEXTMENU pContextMenu = NULL; m_pSFParent->GetUIObjectOf( m_hwndParent, uItems, (LPCITEMIDLIST*)aItems, IID_IContextMenu, NULL, (LPVOID*)&pContextMenu); if(pContextMenu) { HMENU hMenu = CreatePopupMenu(); /* See if we are in Explore or Open mode. If the browser's tree is present, then we are in Explore mode. */ BOOL fExplore = FALSE; HWND hwndTree = NULL; if(SUCCEEDED(m_pShellBrowser->GetControlWindow(FCW_TREE, &hwndTree)) && hwndTree) { fExplore = TRUE; } if(hMenu && SUCCEEDED(pContextMenu->QueryContextMenu( hMenu, 0, MENU_OFFSET, MENU_MAX, CMF_NORMAL | (fExplore ? CMF_EXPLORE : 0)))) { } else { DestroyMenu(hMenu); hMenu = NULL; } } } return hMenu; } 的命令标识符,您应使用为开放 ShellExecuteEx 或浏览文件夹。 要使用为开放 ShellexecuteEx 或浏览文件夹,您需要 执行下列操作:
示例代码下面是如何执行此操作的示例:
STDMETHODIMP CContextMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) { if(HIWORD(lpcmi->lpVerb)) { //the command is being sent via a verb return NOERROR; } if(LOWORD(lpcmi->lpVerb) > IDM_LAST) return E_INVALIDARG; switch(LOWORD(lpcmi->lpVerb)) { case IDM_EXPLORE: case IDM_OPEN: { LPITEMIDLIST pidlFQ; SHELLEXECUTEINFO sei; /* Only one PIDL can be passed to ShellExecuteEx, so default to the first one in the list. */ pidlFQ = CreateFullyQualifiedPidl(m_aPidls[0]); ZeroMemory(&sei, sizeof(sei)); sei.cbSize = sizeof(sei); sei.fMask = SEE_MASK_IDLIST | SEE_MASK_CLASSNAME; sei.lpIDList = pidlFQ; sei.lpClass = TEXT("folder"); sei.hwnd = lpcmi->hwnd; sei.nShow = SW_SHOWNORMAL; if(LOWORD(lpcmi->lpVerb) == IDM_EXPLORE) sei.lpVerb = TEXT("explore"); else sei.lpVerb = TEXT("open"); ShellExecuteEx(&sei); DeletePidl(pidlFQ); } break; } return NOERROR; } 参考
Microsoft 系统日志,1996 年 7 月,"扩展 Windows 资源管理器的名称空间扩展,"页面 41,David 斌
有关其他信息,请参阅 Microsoft 知识库中相应的文章:
178665
示例: RegView.exe: 外壳命名空间扩展示例
属性
文章编号: 179911 - 最后修改: 2005年7月11日 - 修订: 1.5
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器
翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法 或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是 我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版:
179911
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。
所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等 信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示 保证和条件在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft 和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的 之损害、数据或利润不负任何责任。 |
MSDN-如何实现研究,并在命名空间扩展中打开
最新推荐文章于 2020-11-20 15:45:49 发布