Exemple #1
0
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));
}
Exemple #2
0
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));
}
Exemple #4
0
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)));
}