+class CTrayWindowCtxMenu :
+ public CComCoClass<CTrayWindowCtxMenu>,
+ public CComObjectRootEx<CComMultiThreadModelNoCS>,
+ public IContextMenu
+{
+ HWND hWndOwner;
+ CComPtr<CTrayWindow> TrayWnd;
+ CComPtr<IContextMenu> pcm;
+
+public:
+ HRESULT Initialize(ITrayWindow * pTrayWnd, IN HWND hWndOwner)
+ {
+ this->TrayWnd = (CTrayWindow *) pTrayWnd;
+ this->hWndOwner = hWndOwner;
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE
+ QueryContextMenu(HMENU hPopup,
+ UINT indexMenu,
+ UINT idCmdFirst,
+ UINT idCmdLast,
+ UINT uFlags)
+ {
+ HMENU menubase = LoadPopupMenu(hExplorerInstance, MAKEINTRESOURCE(IDM_TRAYWND));
+
+ if (menubase)
+ {
+ int count = ::GetMenuItemCount(menubase);
+
+ for (int i = 0; i < count; i++)
+ {
+ WCHAR label[128];
+
+ MENUITEMINFOW mii = { 0 };
+ mii.cbSize = sizeof(mii);
+ mii.fMask = MIIM_STATE | MIIM_ID | MIIM_SUBMENU | MIIM_CHECKMARKS
+ | MIIM_DATA | MIIM_STRING | MIIM_BITMAP | MIIM_FTYPE;
+ mii.dwTypeData = label;
+ mii.cch = _countof(label);
+ ::GetMenuItemInfoW(menubase, i, TRUE, &mii);
+
+ TRACE("Adding item %d label %S type %d\n", mii.wID, mii.dwTypeData, mii.fType);
+
+ mii.fType |= MFT_RADIOCHECK;
+
+ ::InsertMenuItemW(hPopup, i + 1, TRUE, &mii);
+ }
+
+ ::DestroyMenu(menubase);
+
+ if (SHRestricted(REST_CLASSICSHELL) != 0)
+ {
+ DeleteMenu(hPopup,
+ ID_LOCKTASKBAR,
+ MF_BYCOMMAND);
+ }
+
+ CheckMenuItem(hPopup,
+ ID_LOCKTASKBAR,
+ MF_BYCOMMAND | (TrayWnd->Locked ? MF_CHECKED : MF_UNCHECKED));
+
+ if (TrayWnd->TrayBandSite != NULL)
+ {
+ if (SUCCEEDED(TrayWnd->TrayBandSite->AddContextMenus(
+ hPopup,
+ 0,
+ ID_SHELL_CMD_FIRST,
+ ID_SHELL_CMD_LAST,
+ CMF_NORMAL,
+ &pcm)))
+ {
+ return S_OK;
+ }
+ }
+
+ }
+
+ return E_FAIL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE
+ InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
+ {
+ UINT uiCmdId = (UINT) lpici->lpVerb;
+ if (uiCmdId != 0)
+ {
+ if (uiCmdId >= ID_SHELL_CMD_FIRST && uiCmdId <= ID_SHELL_CMD_LAST)
+ {
+ CMINVOKECOMMANDINFO cmici = { 0 };
+
+ if (pcm != NULL)
+ {
+ /* Setup and invoke the shell command */
+ cmici.cbSize = sizeof(cmici);
+ cmici.hwnd = hWndOwner;
+ cmici.lpVerb = (LPCSTR) MAKEINTRESOURCE(uiCmdId - ID_SHELL_CMD_FIRST);
+ cmici.nShow = SW_NORMAL;
+
+ pcm->InvokeCommand(&cmici);
+ }
+ }
+ else
+ {
+ TrayWnd->ExecContextMenuCmd(uiCmdId);
+ }
+ }
+
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE
+ GetCommandString(UINT_PTR idCmd,
+ UINT uType,
+ UINT *pwReserved,
+ LPSTR pszName,
+ UINT cchMax)
+ {
+ return E_NOTIMPL;
+ }
+
+ CTrayWindowCtxMenu()
+ {
+ }
+
+ virtual ~CTrayWindowCtxMenu()
+ {
+ }
+
+ BEGIN_COM_MAP(CTrayWindowCtxMenu)
+ COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
+ END_COM_MAP()