MSDN-如何实现研究,并在命名空间扩展中打开

如何实现研究,并在命名空间扩展中打开


本页

概要

在创建一个具有多个级别的文件夹的命名空间扩展时,可能需要实现资源管理器并从上下文菜单打开命令。 本文讨论
如何实现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));
   }
				
要确定您外壳视图是否在打开或资源管理器模式中显示,请使用 IShellBrowser::GetControlWindow 方法来传递
 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;
   }
				
当用户在菜单中选择一项时,则将调用您的 IContextMenu::InvokeCommand。 如果您的资源管理器或打开命令
的命令标识符,您应使用为开放 ShellExecuteEx 或浏览文件夹。
要使用为开放 ShellexecuteEx 或浏览文件夹,您需要
执行下列操作:
  1. 指定 SEE_MASK_IDLIST 标志和传递要打开或研究项目的完全限定的 PIDL。
  2. 指定 SEE_MASK_CLASSNAME 标志和指定类名为"文件夹。
  3. 指定在浏览器窗口的窗口句柄。ShellExecuteEx 将尝试建立与此窗口的 DDE 对话,如果应在同一窗口中浏览该
    文件夹。
    如果要从外壳视图调用 InvokeCommand,您应传递视图的父窗口句柄。这通常是通过调用
    IShellBrowser::GetWindow 方法在 IShellView::CreateViewWindow 中获取。
  4. 指定为"浏览"或"打开",取决于所需命令的动作。

示例代码

下面是如何执行此操作的示例:
   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
这篇文章中的信息适用于:
  • Microsoft Platform Software Development Kit-January 2000 Edition
关键字: 
kbmt kbextension kbhowto kbnamespace KB179911 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器
翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法
或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是
我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版:  179911
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。
所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等
信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示
保证和条件在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft
和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的
之损害、数据或利润不负任何责任。

引用: http://support.microsoft.com/kb/179911/zh-cn

你可能感兴趣的:(Window,Shell编程,扩展,microsoft,windows,command,string,menu)