如何正确显示基于资源管理器的右键菜单

4
我使用Sertac Akyuz在此处回答中提供的代码创建了此菜单:Show the default right-click menu - Delphi,它运行良好,但存在问题: 当我点击创建的菜单中的“删除”(将文件删除到回收站)时,它会询问我:确定要删除吗? 当我点击“是”时,它可以正常工作,但当我点击“否”时,它会显示一个错误, 我在调试器中看到,错误出现在这一行:
OleCheck(ContextMenu.InvokeCommand(CommandInfo));

Error: ###(gdb unparsed remainder:s 0x0 out of bounds>)###.

我使用Lazarus,但我认为Delphi也同样适用。似乎菜单(窗口)试图向我的程序返回答案“不”,在这种情况下会发生错误。如何解决这个问题?如何正确地处理答案“不”的情况?

1
尝试在Double Commander源代码中查找其实现:svn co https://doublecmd.svn.sourceforge.net/svnroot/doublecmd doublecmd。<br /> 我不确定,但答案可能可以在此文件中找到:doublecmd\trunk\src\platform\win\ushellcontextmenu.pas - Abelisto
请不要将Lazarus中的调试运行时问题标记为Delphi。这会让人感到困惑。如果您正在提出调试问题,请选择一个工具。 - Warren P
1个回答

3

您没有指定错误编号,但在我尝试复制步骤时,OleCheck调用失败,错误代码是0x80270000。高位部分除了错误位外是0x27(39),这是在winerror.h中定义的FACILTY_SHELL。如您所见,低位是“0”,表示shell未给出任何特定的错误代码,实际上该代码与ERROR_SUCCESSNO_ERROR相同。

我理解为,shell只是通知命令(删除操作)失败了。失败原因是用户取消了操作。我的建议是,根据需要修改代码。您已经知道操作失败了,但您可以选择忽略它,或者通知用户。也许可以像这样:

var
  ...
  InvokeResult: HRESULT;
begin

  ...
//      OleCheck(ContextMenu.InvokeCommand(CommandInfo));
      InvokeResult := ContextMenu.InvokeCommand(CommandInfo);
      if not Succeeded(InvokeResult) then begin
        if LoWord(InvokeResult) = NO_ERROR then
          ShowMessage('Command did not carried out')
        else
          OleError(InvokeResult);
      end;
    ...

但是如果我不想分析结果,我可以这样做吗: try OleCheck(ContextMenu.InvokeCommand(CommandInfo)); except end; 或者简单地:InvokeResult := ContextMenu.InvokeCommand(CommandInfo); 而不分析结果。 - user2154246
你的代码正确——没有菜单项: 重命名。 在我的应用程序中,我不需要这个项目,但理论上:我们如何修改代码以显示重命名项目,并处理单击此项目并显示特殊表单的操作,让用户可以进行重命名。 - user2154246
@user - 针对您的第二条评论。是的,如果您不想检查结果,简单方法是正确的选择,请不要调用OleCheck。 关于第三条评论-通常情况下,您将编写一个shell扩展,请参见此问题。我不知道是否可以在显示菜单后干预菜单,请提问。   另外,不用谢。 :) - Sertac Akyuz
再次感谢, 1)注意:我的意思是,在这里: http://www.freepascal.ru/forum/viewtopic.php?f=5&t=3300 有一个重命名此项的代码,没有添加任何特殊的内容。您的代码与此变体之间的区别是什么-我不知道,我没有进行分析。 2)理论问题:我们是否可以从创建的菜单中删除项目,例如删除“删除”项目? - user2154246
1
我猜我明白了:如果在QueryContextMenu命令中使用CMF_CANRENAME标志,那么重命名项目将出现。 - user2154246
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接