windows系统右键菜单添加

  1. 创建ATL项目

2.创建ATL简单对象

就会生产文件: MyShellExt.h

3. 查找lib的uuid

在文件dllmain.h中查找:

41eb5b41-952a-4209-a9ee-ec782e1c6e5b

  1. 查找对象UUID

查找方式***_i.h文件末尾, #ifdef __cpluscplus下方就是,得到的是:

50c05e80-a560-4732-8909-599a41f1e5ab

  1. 增加注册表

在文件MyShellExt.rgs增加如下信息:里面的uuid是上面提到的两个uuid

HKCR

{

    NoRemove *

    {

        NoRemove ShellEx

        {

            NoRemove ContextMenuHandlers

            {

                ForceRemove MyShellExt = s '{50c05e80-a560-4732-8909-599a41f1e5ab}'

            }

        }

    } 

    

    NoRemove lnkfile

    {

         NoRemove shellex

         {

             NoRemove ContextMenuHandlers

             {

                  ForceRemove MyShellExt = s '{50c05e80-a560-4732-8909-599a41f1e5ab}'

             }

         }

    }

    NoRemove Directory

    {

         NoRemove Background

         {

             NoRemove ShellEx

             {

                  NoRemove ContextMenuHandlers

                  {

                      ForceRemove MyShellExt = s '{50c05e80-a560-4732-8909-599a41f1e5ab}'

                  }

             }

        }

    }

    NoRemove CLSID

    {

         ForceRemove {50c05e80-a560-4732-8909-599a41f1e5ab} = s 'SudaMenu class'

         {

             ForceRemove Programmable

             InprocServer32 = s '%MODULE%'

             {

                  val ThreadingModel = s 'Apartment'

             }

             TypeLib = s '{41eb5b41-952a-4209-a9ee-ec782e1c6e5b}'

             Version = s '1.0'

         }

    }

}

HKLM

{

    NoRemove SOFTWARE

    {

         NoRemove Microsoft

         {

             NoRemove Windows

             {

                  NoRemove CurrentVersion

                  {

                      NoRemove 'Shell Extensions'

                      {

                          NoRemove Approved

                          {

                               val {50c05e80-a560-4732-8909-599a41f1e5ab} = s '自定义鼠标右键 Shell Extension'

                          }

                      }

                  }

             }

         }

    }

}

  1. 实现接口

public IContextMenu,

public IShellExtInit

  1. 代码如下:
  2. // MyShellExt.h: CMyShellExt 的声明
  3. #pragma once
  4. #include "resource.h"       // 主符号
  5. #include "MyOsRightMenu_i.h"
  6. #if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
  7. #error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"
  8. #endif
  9. using namespace ATL;
  10. // CMyShellExt
  11. class ATL_NO_VTABLE CMyShellExt :
  12. public CComObjectRootEx<CComSingleThreadModel>,
  13. public CComCoClass<CMyShellExt, &CLSID_MyShellExt>,
  14. public IDispatchImpl<IMyShellExt, &IID_IMyShellExt, &LIBID_MyOsRightMenuLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
  15. public IContextMenu,
  16. public IShellExtInit
  17. {
  18. public:
  19. CMyShellExt()
  20. {
  21. }
  22. DECLARE_REGISTRY_RESOURCEID(106)
  23. BEGIN_COM_MAP(CMyShellExt)
  24. COM_INTERFACE_ENTRY(IMyShellExt)
  25. COM_INTERFACE_ENTRY(IDispatch)
  26. COM_INTERFACE_ENTRY(IContextMenu)   // QueryContextMenu / InvokeCommand / GetCommandString
  27. COM_INTERFACE_ENTRY(IShellExtInit) // Initialize
  28. END_COM_MAP()
  29. DECLARE_PROTECT_FINAL_CONSTRUCT()
  30. HRESULT FinalConstruct()
  31. {
  32.      return S_OK;
  33. }
  34. void FinalRelease()
  35. {
  36. }
  37. public:
  38. STDMETHODIMP QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
  39. {
  40.      //MessageBox(NULL, L"123", L"456", MB_OK);
  41.      AddCommand(hmenu, idCmdFirst, indexMenu, L"你好世界", NULL);
  42.      return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 1);
  43. }
  44. STDMETHODIMP InvokeCommand(CMINVOKECOMMANDINFO* pici)
  45. {
  46.      return E_INVALIDARG;
  47. }
  48. STDMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uType, UINT* pReserved, LPSTR pszName, UINT cchMax)
  49. {
  50.      return S_OK;
  51. }
  52. STDMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject* pdtobj, HKEY hkeyProgID)
  53. {
  54.      if (pidlFolder && !pidlFolder->mkid.cb)
  55.      {
  56.          //桌面
  57.      }
  58.      else if (pdtobj)
  59.          InitializeShortCut(pdtobj);
  60.      return S_OK;
  61. }
  62. private:
  63. private:
  64. HRESULT InitializeShortCut(IDataObject* pdtobj)
  65. {
  66.      if (pdtobj == NULL)
  67.          return E_INVALIDARG;
  68.      FORMATETC fe = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
  69.          STGMEDIUM stm;
  70.          if (FAILED(pdtobj->GetData(&fe, &stm)))
  71.              return E_INVALIDARG;
  72.          HDROP hDrop = (HDROP)GlobalLock(stm.hGlobal);
  73.          if (NULL == hDrop)
  74.          {
  75.              ReleaseStgMedium(&stm);
  76.              return E_INVALIDARG;
  77.          }
  78.          UINT nFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
  79.          if (nFiles != 1)
  80.          {
  81.              GlobalUnlock(stm.hGlobal);
  82.              ReleaseStgMedium(&stm);
  83.              return E_INVALIDARG;
  84.          }
  85.          WCHAR szFileBuf[0x1000];
  86.          for (int i = 0; i < nFiles; i++)
  87.          {
  88.              if (DragQueryFile((HDROP)hDrop, 0, szFileBuf, _countof(szFileBuf)) != 0)
  89.              {
  90.              }
  91.          }
  92.          GlobalUnlock(stm.hGlobal);
  93.          ReleaseStgMedium(&stm);
  94.          return S_OK;
  95.     }
  96.     BOOL AddCommand(HMENU hPopupMenu, int nCommandId, int nPosition, LPCTSTR lpszDes, HBITMAP bmpItem)
  97.     {
  98.          MENUITEMINFOW info;
  99.          info.dwTypeData = (LPTSTR)lpszDes;
  100.          info.fMask = MIIM_STRING | MIIM_ID/* | MIIM_CHECKMARKS*/;
  101.          info.wID = nCommandId;
  102.          info.hbmpChecked = bmpItem;
  103.          info.hbmpUnchecked = bmpItem;
  104.          return InsertMenuItem(hPopupMenu, nPosition, TRUE, &info);
  105.     }
  106. };
  107. OBJECT_ENTRY_AUTO(__uuidof(MyShellExt), CMyShellExt)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值