STDMETHODIMP DropExt_QueryContextMenu(LPCONTEXTMENU pctm, HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) { UINT idCmd = idCmdFirst; InsertMenu(hmenu, indexMenu++, MF_STRING|MF_BYPOSITION, idCmd++, "Check H&DROP (dropext)"); InsertMenu(hmenu, indexMenu++, MF_STRING|MF_BYPOSITION, idCmd++, "Check H&NRES (dropext)"); return ResultFromScode(MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_NULL, (USHORT)2)); }
HRESULT PASCAL CComObjectRoot::Error(const CLSID& clsid, HINSTANCE hInst, UINT nID, const IID& iid, HRESULT hRes) { OLECHAR szDesc[1024]; szDesc[0] = NULL; // For a valid HRESULT the id should be in the range [0x0200, 0xffff] _ASSERTE((nID >= 0x0200 && nID <= 0xffff) || hRes != 0); if (LoadStringW(hInst, nID, szDesc, 1024) == 0) { _ASSERTE(FALSE); wcscpy(szDesc, L"Unknown Error"); } Error(clsid, szDesc, iid, hRes); if (hRes == 0) hRes = MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, nID); return hRes; }
STDMETHODIMP CContextMenuHandler::QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) { #ifdef DEBUG_TO_LOG_FILES char tbuf[200]; sprintf_s(tbuf,200,__FUNCTION__ ": index=%u, first=%u, last=%u, flags=%.08lX, path=%S",indexMenu,idCmdFirst,idCmdLast,uFlags,sPath.GetString()); f_log(tbuf); #endif if (CMF_DEFAULTONLY & uFlags) return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(0)); if (sPath.IsEmpty()) return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(0)); m_idCmdFirst = idCmdFirst; DWORD lastId = idCmdFirst; // Synchronization syncAutoLock oLock(g_oSync); // This lock is REQUIRED to protect shared configuration access { MENUITEMINFO miSeparator; miSeparator.fMask = MIIM_TYPE; miSeparator.fType = MFT_SEPARATOR; InsertMenuItem(hmenu, indexMenu++, TRUE, &miSeparator); } if (g_settingsHandler->GetBehaviorSettings().shellSettings.bRunConsoleMenItem) { // get item name wstring sItemName = g_settingsHandler->GetInternationalizationSettings().strExplorerMenuRunItem; if (sItemName.size() <= 0) sItemName = szItemRunConsole; // Fill main menu first item info MENUITEMINFO miRunConsole; memset(&miRunConsole, 0, sizeof(MENUITEMINFO)); miRunConsole.cbSize = sizeof(MENUITEMINFO); miRunConsole.fMask = 0; miRunConsole.fMask |= MIIM_ID; miRunConsole.wID = idCmdFirst + eMC_RunConsole; miRunConsole.fMask |= MIIM_TYPE; miRunConsole.fType = MFT_STRING; miRunConsole.dwTypeData = const_cast<LPTSTR>(sItemName.c_str()); miRunConsole.cch = sItemName.size(); miRunConsole.fMask |= MIIM_STATE; miRunConsole.fState = MFS_ENABLED; miRunConsole.fMask |= MIIM_CHECKMARKS; miRunConsole.hbmpChecked = (HBITMAP)LoadImage(_AtlBaseModule.GetResourceInstance(),MAKEINTRESOURCE(IDB_MENU_PICTURE),IMAGE_BITMAP,0,0,LR_LOADTRANSPARENT); miRunConsole.hbmpUnchecked = (HBITMAP)LoadImage(_AtlBaseModule.GetResourceInstance(),MAKEINTRESOURCE(IDB_MENU_PICTURE),IMAGE_BITMAP,0,0,LR_LOADTRANSPARENT); // Insert menu item BOOL r = InsertMenuItem(hmenu, indexMenu, TRUE, &miRunConsole); indexMenu++; lastId = idCmdFirst + eMC_RunConsole; } if (g_settingsHandler->GetBehaviorSettings().shellSettings.bPostConsoleMenItem) { // get item name wstring sItemName = g_settingsHandler->GetInternationalizationSettings().strExplorerMenuPostItem; if (sItemName.size() <= 0) sItemName = szItemPostConsole; // Fill main menu first item info MENUITEMINFO miPostConsole; memset(&miPostConsole, 0, sizeof(MENUITEMINFO)); miPostConsole.cbSize = sizeof(MENUITEMINFO); miPostConsole.fMask = 0; miPostConsole.fMask |= MIIM_ID; miPostConsole.wID = idCmdFirst + eMC_PostConsole; miPostConsole.fMask |= MIIM_TYPE; miPostConsole.fType = MFT_STRING; miPostConsole.dwTypeData = const_cast<LPTSTR>(sItemName.c_str()); miPostConsole.cch = sItemName.size(); miPostConsole.fMask |= MIIM_STATE; miPostConsole.fState = MFS_ENABLED; miPostConsole.fMask |= MIIM_CHECKMARKS; miPostConsole.hbmpChecked = (HBITMAP)LoadImage(_AtlBaseModule.GetResourceInstance(),MAKEINTRESOURCE(IDB_MENU_PICTURE),IMAGE_BITMAP,0,0,LR_LOADTRANSPARENT); miPostConsole.hbmpUnchecked = (HBITMAP)LoadImage(_AtlBaseModule.GetResourceInstance(),MAKEINTRESOURCE(IDB_MENU_PICTURE),IMAGE_BITMAP,0,0,LR_LOADTRANSPARENT); // Insert menu item BOOL r = InsertMenuItem(hmenu, indexMenu, TRUE, &miPostConsole); indexMenu++; lastId = idCmdFirst + eMC_PostConsole; } if (g_settingsHandler->GetBehaviorSettings().shellSettings.bRunConsoleTabMenuItem) { HMENU hSubMenu = CreateMenu(); if (!hSubMenu) return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(0)); // Create submenu for (DWORD i = 0, lim = g_vTabs.size(); i < lim; ++i) { wstring sTabName = g_vTabs[i]->sName; HBITMAP hTabIcon = g_vTabs[i]->hIconBmp; // Fill main menu item info MENUITEMINFO miRunTabConsole; memset(&miRunTabConsole, 0, sizeof(MENUITEMINFO)); miRunTabConsole.cbSize = sizeof(MENUITEMINFO); miRunTabConsole.fMask = MIIM_STRING | MIIM_ID | (hTabIcon ? MIIM_CHECKMARKS : 0); miRunTabConsole.wID = idCmdFirst + eMC_RunConsoleWithTab + i; miRunTabConsole.dwTypeData = const_cast<LPTSTR>(sTabName.c_str()); miRunTabConsole.cch = sTabName.size(); if (hTabIcon) miRunTabConsole.hbmpChecked = miRunTabConsole.hbmpUnchecked = hTabIcon; // Insert menu item InsertMenuItem(hSubMenu, i, TRUE, &miRunTabConsole); lastId = miRunTabConsole.wID; } // get item name wstring sItemName = g_settingsHandler->GetInternationalizationSettings().strExplorerMenuRunWithItem; if (sItemName.size() <= 0) sItemName = szItemRunConsoleWithTab; // Fill main menu item info MENUITEMINFO miRunTabConsoleMenu; memset(&miRunTabConsoleMenu, 0, sizeof(MENUITEMINFO)); miRunTabConsoleMenu.cbSize = sizeof(MENUITEMINFO); miRunTabConsoleMenu.fMask = MIIM_CHECKMARKS|MIIM_STRING|MIIM_ID|MIIM_SUBMENU; miRunTabConsoleMenu.wID = idCmdFirst + eMC_RunConsoleWithTabFake; miRunTabConsoleMenu.dwTypeData = const_cast<LPTSTR>(sItemName.c_str()); miRunTabConsoleMenu.cch = sItemName.size(); miRunTabConsoleMenu.hSubMenu = hSubMenu; miRunTabConsoleMenu.hbmpChecked = (HBITMAP)LoadImage(_AtlBaseModule.GetResourceInstance(),MAKEINTRESOURCE(IDB_MENU_PICTURE),IMAGE_BITMAP,0,0,LR_LOADTRANSPARENT); miRunTabConsoleMenu.hbmpUnchecked = (HBITMAP)LoadImage(_AtlBaseModule.GetResourceInstance(),MAKEINTRESOURCE(IDB_MENU_PICTURE),IMAGE_BITMAP,0,0,LR_LOADTRANSPARENT); // Insert menu item InsertMenuItem(hmenu, indexMenu++, TRUE, &miRunTabConsoleMenu); lastId = idCmdFirst + eMC_RunConsoleWithTab + g_vTabs.size() - 1; } if (g_settingsHandler->GetBehaviorSettings().shellSettings.bPostConsoleTabMenuItem) { HMENU hSubMenu = CreateMenu(); if (!hSubMenu) return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(0)); // Create submenu for (DWORD i = 0, lim = g_vTabs.size(); i < lim; ++i) { wstring sTabName = g_vTabs[i]->sName; HBITMAP hTabIcon = g_vTabs[i]->hIconBmp; // Fill main menu item info MENUITEMINFO miPostTabConsole; memset(&miPostTabConsole, 0, sizeof(MENUITEMINFO)); miPostTabConsole.cbSize = sizeof(MENUITEMINFO); miPostTabConsole.fMask = MIIM_STRING | MIIM_ID | (hTabIcon ? MIIM_CHECKMARKS : 0); miPostTabConsole.wID = idCmdFirst + eMC_PostConsoleWithTab + i; miPostTabConsole.dwTypeData = const_cast<LPTSTR>(sTabName.c_str()); miPostTabConsole.cch = sTabName.size(); if (hTabIcon) miPostTabConsole.hbmpChecked = miPostTabConsole.hbmpUnchecked = hTabIcon; // Insert menu item InsertMenuItem(hSubMenu, i, TRUE, &miPostTabConsole); lastId = miPostTabConsole.wID; } // get item name wstring sItemName = g_settingsHandler->GetInternationalizationSettings().strExplorerMenuPostWithItem; if (sItemName.size() <= 0) sItemName = szItemPostConsoleWithTab; // Fill main menu item info MENUITEMINFO miPostTabConsoleMenu; memset(&miPostTabConsoleMenu, 0, sizeof(MENUITEMINFO)); miPostTabConsoleMenu.cbSize = sizeof(MENUITEMINFO); miPostTabConsoleMenu.fMask = MIIM_CHECKMARKS|MIIM_STRING|MIIM_ID|MIIM_SUBMENU; miPostTabConsoleMenu.wID = idCmdFirst + eMC_PostConsoleWithTabFake; miPostTabConsoleMenu.dwTypeData = const_cast<LPTSTR>(sItemName.c_str()); miPostTabConsoleMenu.cch = sItemName.size(); miPostTabConsoleMenu.hSubMenu = hSubMenu; miPostTabConsoleMenu.hbmpChecked = (HBITMAP)LoadImage(_AtlBaseModule.GetResourceInstance(),MAKEINTRESOURCE(IDB_MENU_PICTURE),IMAGE_BITMAP,0,0,LR_LOADTRANSPARENT); miPostTabConsoleMenu.hbmpUnchecked = (HBITMAP)LoadImage(_AtlBaseModule.GetResourceInstance(),MAKEINTRESOURCE(IDB_MENU_PICTURE),IMAGE_BITMAP,0,0,LR_LOADTRANSPARENT); // Insert menu item InsertMenuItem(hmenu, indexMenu++, TRUE, &miPostTabConsoleMenu); lastId = idCmdFirst + eMC_PostConsoleWithTab + g_vTabs.size() - 1; } #if 0 { MENUITEMINFO miSeparator; miSeparator.fMask = MIIM_TYPE; miSeparator.fType = MFT_SEPARATOR; InsertMenuItem(hmenu, indexMenu++, TRUE, &miSeparator); } #endif return ResultFromScode(MAKE_SCODE(SEVERITY_SUCCESS, 0, (USHORT)(lastId - idCmdFirst + 1))); //return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(lastId - idCmdFirst + 1)); }
STDMETHODIMP CDeskBand::QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT /*idCmdLast*/, UINT uFlags) { if ((uFlags & CMF_DEFAULTONLY)!=0) return S_OK; //we don't change the default action if (((uFlags & 0x000f)!=CMF_NORMAL)&&(!(uFlags & CMF_EXPLORE))&&(!(uFlags & CMF_VERBSONLY))) return S_OK; if ((m_ContextDirectory.empty()) && (m_ContextItems.empty())) return S_OK; if (m_ContextDirectory.empty()) { // folder is empty, but maybe files are selected if (m_ContextItems.empty()) return S_OK; // nothing selected - we don't have a menu to show // check whether a selected entry is an UID - those are namespace extensions // which we can't handle for (std::map<tstring, ULONG>::const_iterator it = m_ContextItems.begin(); it != m_ContextItems.end(); ++it) { if (_tcsncmp(it->first.c_str(), _T("::{"), 3)==0) return S_OK; } } else { // ignore namespace extensions if (_tcsncmp(m_ContextDirectory.c_str(), _T("::{"), 3)==0) return S_OK; } if (DWORD(CRegStdDWORD(_T("Software\\StefansTools\\StExBar\\ContextMenu"), TRUE)) == FALSE) return S_OK; //check if we already added our menu entry for a folder. //we check that by iterating through all menu entries and check if //the dwItemData member points to our global ID string. That string is set //by our shell extension when the folder menu is inserted. TCHAR menubuf[MAX_PATH]; int count = GetMenuItemCount(hMenu); for (int i=0; i<count; ++i) { MENUITEMINFO miif; SecureZeroMemory(&miif, sizeof(MENUITEMINFO)); miif.cbSize = sizeof(MENUITEMINFO); miif.fMask = MIIM_DATA; miif.dwTypeData = menubuf; miif.cch = _countof(menubuf); GetMenuItemInfo(hMenu, i, TRUE, &miif); if (miif.dwItemData == (ULONG_PTR)g_MenuIDString) return S_OK; } UINT idCmd = idCmdFirst; //create the sub menu HMENU subMenu = CreateMenu(); int indexSubMenu = 0; m_commands.LoadFromFile(); int index = 0; for (int j = 0; j < m_commands.GetCount(); ++j) { MENUITEMINFO menuiteminfo = {0}; Command cmd = m_commands.GetCommand(j); m_hotkeys[cmd.key] = j; if ((cmd.commandline.compare(INTERNALCOMMANDHIDDEN)==0)&&(cmd.name.compare(_T("Options")) == 0)) { cmd.commandline = INTERNALCOMMAND; // make sure the options button is never hidden. m_commands.SetCommand(j, cmd); } if ((cmd.name.compare(_T("StexBar Internal Edit Box")) == 0)|| (cmd.commandline.compare(INTERNALCOMMANDHIDDEN) == 0)|| (cmd.name.compare(_T("New Folder")) == 0)) { continue; } bool bEnabled = cmd.enabled_viewpath || (cmd.enabled_fileselected && !m_ContextItems.empty()) || (cmd.enabled_folderselected && (!m_ContextItems.empty() || !m_ContextDirectory.empty())) || (cmd.enabled_noselection && (m_ContextItems.empty())) || (cmd.enabled_selectedcount && (cmd.enabled_selectedcount == (int)!m_ContextItems.empty())); HICON hIcon = LoadCommandIcon(cmd); if (hIcon) { menuiteminfo.hbmpItem = IsWindowsVistaOrGreater() ? IconToBitmapPARGB32(hIcon) : HBMMENU_CALLBACK; DestroyIcon(hIcon); } else menuiteminfo.hbmpItem = NULL; if (!cmd.separator) m_tooltips[j] = cmd.name.c_str(); myIDMap[idCmd - idCmdFirst] = j; myIDMap[idCmd] = j; menuiteminfo.cbSize = sizeof(menuiteminfo); menuiteminfo.fMask = cmd.separator ? MIIM_FTYPE : MIIM_FTYPE | MIIM_ID | MIIM_BITMAP | MIIM_STRING | MIIM_STATE; menuiteminfo.fType = cmd.separator ? MFT_SEPARATOR : MFT_STRING; menuiteminfo.fState = bEnabled ? MFS_ENABLED : MFS_DISABLED; TCHAR menutextbuf[100]; _tcscpy_s(menutextbuf, _countof(menutextbuf), m_commands.GetCommandPtr(j)->name.c_str()); menuiteminfo.dwTypeData = menutextbuf; menuiteminfo.wID = idCmd++; InsertMenuItem(subMenu, indexSubMenu++, TRUE, &menuiteminfo); index++; } //add sub menu to main context menu //don't use InsertMenu because this will lead to multiple menu entries in the explorer file menu. //see http://support.microsoft.com/default.aspx?scid=kb;en-us;214477 for details of that. MENUITEMINFO menuiteminfo = {0}; SecureZeroMemory(&menuiteminfo, sizeof(menuiteminfo)); menuiteminfo.cbSize = sizeof(menuiteminfo); menuiteminfo.fMask = MIIM_FTYPE | MIIM_ID | MIIM_SUBMENU | MIIM_DATA | MIIM_STRING; menuiteminfo.fType = MFT_STRING; menuiteminfo.dwTypeData = _T("StEx"); menuiteminfo.hSubMenu = subMenu; menuiteminfo.wID = idCmd++; InsertMenuItem(hMenu, indexMenu++, TRUE, &menuiteminfo); //return number of menu items added return ResultFromScode(MAKE_SCODE(SEVERITY_SUCCESS, 0, (USHORT)(idCmd - idCmdFirst))); }