获取指定文件的右键菜单和行为
发布时间
阅读量:
阅读量
该代码实现了一个类似Windows右键菜单的功能,能够创建文件的右键菜单并执行部分操作,如复制和剪切。代码通过调用Windows API函数(如SHGetDesktopFolder、SHBindToParent、CreatePopupMenu等)来模拟文件右键菜单的行为。然而,由于未正确绑定文件对象,导致复制粘贴功能无法成功执行。代码尝试获取菜单项并执行右键操作,但由于绑定失败,最终未能实现完整的复制粘贴功能。
开发一个功能类似于Windows桌面文件管理器的程序,该程序需收集桌面文件夹内的所有文件与元文件,其中包含快捷方式等元文件。同时需处理右键功能,拖放操作暂不处理。
输入:窗口句柄,文件名
行为:点击文件右键时的菜单,菜单中的各项操作应与真实点击右键文件时的行为一致。
实现情况:以下实现的功能,右键操作中,复制和剪切功能被禁用,而其他操作均正常运行。具体原因在于系统未真正绑定原文件,而是复制了其中的菜单行为,这导致复制粘贴时无法找到原文件对象。
void MyGetMenu(HWND hWnd,TCHAR* FilePath)
{
DWORD dwErr = 0;
IShellFolder *pIShellFolder = NULL;
HRESULT hr = SHGetDesktopFolder(&pIShellFolder);
if(NOERROR != hr)
{
return;
}
LPITEMIDLIST pidl;
ULONG cbEaten;
DWORD dwAttribs = SFGAO_COMPRESSED;
WCHAR wchPath[256];
MultiByteToWideChar (CP_ACP, 0, FilePath, -1, wchPath, sizeof (wchPath) / sizeof (WCHAR));
hr = pIShellFolder->ParseDisplayName(NULL, NULL, wchPath, &cbEaten, &pidl, &dwAttribs);
if(S_OK != hr)
{
return;
}
IShellFolder *psfParent;
LPCITEMIDLIST pidlRelative = NULL;
hr = SHBindToParent(pidl, IID_IShellFolder, (void**)&psfParent, &pidlRelative);
if(S_OK != hr)
{
return;
}
HMENU myMenu = NULL;
myMenu = CreatePopupMenu();
//LPCONTEXTMENU ppv = NULL;
IContextMenu *ppv = NULL;
pIShellFolder->GetUIObjectOf(NULL, 1, &pidlRelative, IID_IContextMenu, NULL, (void**)&ppv);
ppv->QueryContextMenu(myMenu, GetMenuItemCount(myMenu), 0, 10000, CMF_NORMAL | CMF_EXPLORE);
int i= GetMenuItemCount(myMenu);
MENUITEMINFO MenuItemInfo;
MenuItemInfo.cbSize = sizeof(MENUITEMINFO);
MenuItemInfo.dwTypeData = NULL;
MenuItemInfo.fMask = MIIM_STRING;
MenuItemInfo.fType = MFT_STRING;
UINT itemid = GetMenuItemID(myMenu,1);
if (0==GetMenuItemInfo(myMenu,itemid,FALSE,&MenuItemInfo))
{
dwErr = GetLastError();
}
MenuItemInfo.dwTypeData = new TCHAR[MenuItemInfo.cch+1];
if (0==GetMenuItemInfo(myMenu,itemid,FALSE,&MenuItemInfo))
{
dwErr = GetLastError();
}
POINT pt;
GetCursorPos(&pt);
UINT nCmd = ::TrackPopupMenu(myMenu,TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_RETURNCMD, pt.x,pt.y,0,hWnd,0);
BOOL bResult = FALSE;
CMINVOKECOMMANDINFO ici;
// If a command was selected from the menu, execute it.
if (nCmd)
{
ici.cbSize = sizeof (CMINVOKECOMMANDINFO);
ici.fMask = 0;
ici.hwnd = hWnd;
ici.lpVerb = MAKEINTRESOURCE (nCmd);
ici.lpParameters = NULL;
ici.lpDirectory = NULL;
ici.nShow = SW_SHOWNORMAL;
ici.dwHotKey = 0;
ici.hIcon = NULL;
if (SUCCEEDED (ppv->InvokeCommand(&ici)))
bResult = TRUE;
}
DestroyMenu (myMenu);
ppv->Release ();
}
全部评论 (0)
还没有任何评论哟~
