Advertisement

获取指定文件的右键菜单和行为

阅读量:

该代码实现了一个类似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)

还没有任何评论哟~