【问题标题】:IContextMenu all commands are working fine except copy and cutIContextMenu 所有命令都工作正常,除了复制和剪切
【发布时间】:2013-05-20 15:42:21
【问题描述】:

我正在开发一个 windows-explorer 类型的应用程序,因为我正在尝试调用 IContextMenu 操作,如复制、粘贴、属性、删除等,但 只有复制和剪切 操作没有完成,而他们正在成功调用。

请看下面的场景;

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

CMINVOKECOMMANDINFO cmici={ sizeof(CMINVOKECOMMANDINFO) };
ZeroMemory( &cmici, sizeof(CMINVOKECOMMANDINFO));
cmici.cbSize = sizeof(CMINVOKECOMMANDINFO);
cmici.fMask=0;
cmici.hwnd=m_pOwnerWnd!=NULL ? m_pOwnerWnd->GetSafeHwnd() : NULL;
cmici.lpVerb= "copy";
cmici.lpParameters= NULL;
cmici.lpDirectory=NULL;
cmici.nShow=SW_SHOWNORMAL;
cmici.dwHotKey=0;
cmici.hIcon=NULL;

获取 ITEMIDLIST 的上下文菜单;

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;

命令删除、属性、粘贴等工作正常,除了复制和剪切

请问有人可以在这方面帮助我吗?

谢谢。

【问题讨论】:

  • 调用命令时实际发生了什么?你怎么知道他们没有工作?
  • InvokeCommand(..) 返回成功 (S_OK)。关于工作,在单击 copy (在我的应用程序中的任何项目上)之后,我然后在桌面上执行右键单击以 paste 它但命令 paste 执行不会出现在上下文菜单中。而当我从桌面或任何 Windows 资源管理器窗口中重复相同的过程时,paste 命令在上下文菜单中可见,它允许我在我的应用程序窗口中执行 paste 操作。跨度>
  • 使用各种剪贴板实用程序之一来查看在 1) 资源管理器调用副本时和 2) 当您的程序调用副本时,剪贴板中的确切内容。
  • @Luke 我试过 Ditto 剪贴板管理器和 1) 当我从 Windows 资源管理器和 2) 执行复制时,它会在剪贴板中显示文件路径当我从应用程序窗口执行相同操作时,它不会在剪贴板中显示任何条目,尽管 InvokeCommand(..) 返回 S_OK。
  • 问题已解决。感谢 Jonathan PotterLuke 的帮助。

标签: winapi copy contextmenu cut windows-explorer


【解决方案1】:

link 在标题 OleInitialize 下提到了同样的问题。

我将对 OleInitialize() 的调用移至表单的 OnCreate 事件处理程序,Cut / Copy 菜单项开始工作。

【讨论】:

猜你喜欢
  • 2022-12-09
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 2014-10-02
  • 2018-11-12
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多