Winapi IContextMenu除了复制和剪切之外,所有命令都正常工作

Winapi IContextMenu除了复制和剪切之外,所有命令都正常工作,winapi,copy,contextmenu,cut,windows-explorer,Winapi,Copy,Contextmenu,Cut,Windows Explorer,我正在开发一个windows资源管理器类型的应用程序,因为我正在尝试调用IContextMenu操作,如复制、粘贴、属性、删除等,但仅复制和剪切操作无法完成,因为它们正在成功调用 请参见下面的场景 我正在将CMINVOKECOMMANDINFO.lpVerb设置为相应的命令字符串(“复制”、“粘贴”、“属性”等) 获取ITEMIDLIST的contextmenu HRESULT hResult = lpParentFolder->GetUIObjectOf( m_pOwnerWnd!=

我正在开发一个windows资源管理器类型的应用程序,因为我正在尝试调用IContextMenu操作,如复制、粘贴、属性、删除等,但仅复制和剪切操作无法完成,因为它们正在成功调用

请参见下面的场景

我正在将CMINVOKECOMMANDINFO.lpVerb设置为相应的命令字符串(“复制”、“粘贴”、“属性”等)

获取ITEMIDLIST的contextmenu

HRESULT hResult = lpParentFolder->GetUIObjectOf(
  m_pOwnerWnd!=NULL ? m_pOwnerWnd->GetSafeHwnd() : NULL, 1,
  (const struct _ITEMIDLIST**)&(lpRelativeIDL), IID_IContextMenu, 0,
  (LPVOID*)&lpcm)
hResult=lpcm->QueryContextMenu(hMenu,0,1,0x7fff,dwFlags);
查询上下文菜单

HRESULT hResult = lpParentFolder->GetUIObjectOf(
  m_pOwnerWnd!=NULL ? m_pOwnerWnd->GetSafeHwnd() : NULL, 1,
  (const struct _ITEMIDLIST**)&(lpRelativeIDL), IID_IContextMenu, 0,
  (LPVOID*)&lpcm)
hResult=lpcm->QueryContextMenu(hMenu,0,1,0x7fff,dwFlags);
最后调用

    hResult=lpcm->InvokeCommand(&cmici);

::DestroyMenu(hMenu);

lpcm->Release();

if(FAILED(hResult))  
    return FALSE;

return TRUE;
命令删除、属性、粘贴等操作正常,但复制和剪切除外

在这方面有人能帮我吗


谢谢。

同样的问题在标题下提到


我将对OleInitialize()的调用移动到表单的OnCreate事件处理程序中,并且剪切/复制菜单项开始工作。

相同的问题在标题OleInitialize下提到


我将对OleInitialize()的调用移动到表单的OnCreate事件处理程序中,然后剪切/复制菜单项开始工作。

调用该命令时实际会发生什么?您如何知道它们不工作?InvokeCommand(..)返回success(S_OK)。关于工作,单击“复制”(在应用程序中的任何项目上)后,我在桌面上执行右键单击以粘贴它,但“粘贴”命令不会出现在上下文菜单中。然而,当我从桌面或任何Windows资源管理器窗口重复相同的过程时,“粘贴”命令将在上下文菜单中显示,并允许我在应用程序窗口中执行粘贴操作。使用各种剪贴板实用程序之一查看剪贴板中的确切内容1)当资源管理器调用副本时,2)当程序调用复制。@Luke我尝试了剪贴板管理器,1)当我从windows资源管理器执行复制时,它在剪贴板中显示文件路径;2)当我从应用程序窗口执行相同操作时,它在剪贴板中不显示任何条目,尽管InvokeCommand(..)返回s_OK。问题已得到解决。谢谢乔纳森·波特和卢克的帮助。当你调用命令时,会发生什么?您如何知道它们不工作?InvokeCommand(..)返回success(S_OK)。关于工作,单击“复制”(在应用程序中的任何项目上)后,我在桌面上执行右键单击以粘贴它,但“粘贴”命令不会出现在上下文菜单中。然而,当我从桌面或任何Windows资源管理器窗口重复相同的过程时,“粘贴”命令将在上下文菜单中显示,并允许我在应用程序窗口中执行粘贴操作。使用各种剪贴板实用程序之一查看剪贴板中的确切内容1)当资源管理器调用副本时,2)当程序调用复制。@Luke我尝试了剪贴板管理器,1)当我从windows资源管理器执行复制时,它在剪贴板中显示文件路径;2)当我从应用程序窗口执行相同操作时,它在剪贴板中不显示任何条目,尽管InvokeCommand(..)返回s_OK。问题已得到解决。谢谢Jonathan Potter和Luke的帮助。我在我的c#应用程序中尝试了这一点,但粘贴操作阻止了UI。你有解决方案吗?我在我的c#应用程序中尝试了这个方法,但是粘贴操作阻塞了UI。你有解决办法吗?