Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 处理命名空间扩展中的撤消删除操作_Winapi_Shell Extensions - Fatal编程技术网

Winapi 处理命名空间扩展中的撤消删除操作

Winapi 处理命名空间扩展中的撤消删除操作,winapi,shell-extensions,Winapi,Shell Extensions,我正试图在我的命名空间扩展中处理Ctrl+Z(撤消删除)上下文菜单操作,但我很难找到一种方法来实现这一点 我在文档中看到需要实现FM_UNDELETE_PROC,但没有关于如何注册此回调的详细信息。 还试图设置一个Shell钩子,但没有相关消息到达那里 有什么想法吗? 此外,如何注册删除操作,以便资源管理器允许撤消操作发生。 现在,如果我从另一个位置执行此操作,则会出现这种情况 谢谢, DavidWindows具有每个进程(Vista之前)或全局文件操作堆栈。如果使用诸如SHFileOperat

我正试图在我的命名空间扩展中处理Ctrl+Z(撤消删除)上下文菜单操作,但我很难找到一种方法来实现这一点

我在文档中看到需要实现FM_UNDELETE_PROC,但没有关于如何注册此回调的详细信息。 还试图设置一个Shell钩子,但没有相关消息到达那里

有什么想法吗? 此外,如何注册删除操作,以便资源管理器允许撤消操作发生。 现在,如果我从另一个位置执行此操作,则会出现这种情况

谢谢, David

Windows具有每个进程(Vista之前)或全局文件操作堆栈。如果使用诸如SHFileOperation或IFileOperation interface之类的API函数,则可以传递FOF_ALLOWUNDO标志,但如果源文件参数不包含完全限定路径和文件名,则忽略此标志。这意味着,如果要使用系统文件操作堆栈,shell扩展对象必须具有SFGAO_FILESYSTEM属性,并且在使用SHGDN_FORPARSING参数调用IShellFolder.GetDisplayNameOf时,必须返回有效的文件路径和名称。还需要实现ITransferSource和ITransferDestination接口。所以,如果对象没有SFGAO_FILESYSTEM属性,则必须使用自己的操作堆栈实现


文件夹的后台上下文菜单或“编辑”菜单中的“撤消删除”命令是系统命令,它与shell扩展没有任何关系。您不应该手动处理Ctrl+Z。

如何在IShellFolder.CreateViewObject中创建IContextMenu?您使用自己的实现还是系统默认值?您隐藏了许多细节,包括代码@丹尼斯·阿尼西莫夫(评论很好):)谢谢你的回复,丹尼斯。在我的研究中,我偶然发现了ITransferSource和ITransferDestination,但我发现它们只受Vista支持,所以在XP上不可能实现这种行为,对吗?DavidSorry,但我没有在XP上测试您需要的功能。稍后我会写一些关于results.XP解决方案的文章(没有测试,只是理论):如果您的项目具有SFGAO_文件系统属性,那么它们与实际文件关联。所以只需对真实文件和FOF_ALLOWUNDO标志使用SHFileOperation。用户删除文件后,shell会将记录添加到撤消堆栈中,撤消删除操作将可用。您必须使用SHChangeNotifyRegister监视文件的文件夹。当用户从回收站运行Undo Delete shell还原文件时,您可以捕获还原事件。