我为我正在开发的一个小应用程序开发了一个非常基本的 shell 扩展。我已经使用它一段时间了,没有任何问题,但我只是注意到在 Windows xp 中,在开始菜单 -> 所有程序中,如果我右键单击那里的文件夹并选择“打开”或“探索”,我的出现小应用程序而不是资源管理器窗口。你可以想象当我看到这个的时候我是多么的高兴和自豪。我觉得这很奇怪,因为这是唯一发生的地方(到目前为止......)。我在“目录”注册表项下注册了 shell 扩展,因此它仅在右键单击文件夹时显示。
我找到了一些关于 shell 扩展的好文章,并且到目前为止我已经完成了这些,但是在这个 winapi 东西中我离我的舒适区还很远。我对id做了很多摆弄,但我不知道问题出在哪里。
这是我的 querycontextmenu 实现,我希望我在那里犯了一个愚蠢的错误,C++ 大师可以立即发现。任何帮助将不胜感激。
STDMETHODIMP ShellExtension::QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags){
if (CMF_DEFAULTONLY & uFlags)
{
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0);
}
UINT uID = idCmdFirst;
if (!InsertMenu(hMenu, indexMenu, MF_SEPARATOR | MF_BYPOSITION, 0, NULL))
{
return HRESULT_FROM_WIN32(GetLastError());
}
HMENU hSubmenu = CreatePopupMenu();
InsertMenu (hSubmenu, 0, MF_BYPOSITION, uID++, (this->isFrench ? SET_REF_TEXT : SET_REF_TEXT_EN));
InsertMenu (hSubmenu, 1, MF_BYPOSITION, uID++, (this->isFrench ? SET_COMP_TEXT : SET_COMP_TEXT_EN));
MENUITEMINFO mii = { sizeof(mii) };
mii.fMask = MIIM_FTYPE | MIIM_ID | MIIM_BITMAP | MIIM_SUBMENU | MIIM_DATA | MIIM_STRING;
mii.hSubMenu = hSubmenu;
mii.fType = MFT_STRING;
mii.dwTypeData = (this->isFrench ? MAIN_TEXT : MAIN_TEXT_EN);
mii.hbmpItem = IsRequirePainting() ? HBMMENU_CALLBACK : m_hMenuBmp;
mii.wID = uID++;
if (!InsertMenuItem(hMenu, indexMenu, TRUE, &mii))
{
return HRESULT_FROM_WIN32(GetLastError());
}
if (!InsertMenu(hMenu, indexMenu, MF_SEPARATOR | MF_BYPOSITION, 0, NULL))
{
return HRESULT_FROM_WIN32(GetLastError());
}
return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, uID - idCmdFirst);}
谢谢!
编辑:
这是对我有用的解决方案......对于任何在这里绊倒的人:
STDMETHODIMP ShellExtension::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
{
if (!HIWORD(lpcmi->lpVerb))
{
UINT idCmd = LOWORD(lpcmi->lpVerb);
switch (idCmd)
{
case 0:
doStuffForFirstCommand();
break;
case 1:
doStuffForSecondCommand();
break;
}
return S_OK;
}
else
{
return E_INVALIDARG; //this is what I forgot...
}
}
感谢您的帮助,抱歉代码缩进,似乎我无法弄清楚代码标签。