我知道SHFileOperation可以用Windows资源pipe理器执行文件操作,但是它只执行源和目标都已知的完整文件操作。
是否有一个API允许应用程序从应用程序中剪切,复制或粘贴到Windows资源pipe理器中?
回答几个问题:
使用Windows资源pipe理器执行文件/文件夹操作将大大简化移动多个对象。 这对移动文件夹及其内容特别重要,因为MoveFile
不支持将文件夹移动到不同的卷。
使用Windows资源pipe理器执行文件/文件夹操作将允许将操作添加到Windows资源pipe理器的撤消缓冲区,以便可以撤消操作,否则使用控制台应用程序/命令提示符执行的操作不能撤消。
我相信我已经看到有可能以编程方式执行Windows资源pipe理器动词,但我似乎无法find这样做的方式。
很难想象为什么这样的功能会存在,或者如果这样做会有什么好处。
提供剪切/复制和粘贴以方便用户 。 它允许他们在以后的某个地方移动/复制某些东西。 实现剪切/复制和粘贴功能的应用程序可能不知道数据最终将被粘贴的位置,但这是可以的,因为用户仍然知道。
但是,执行剪切/复制粘贴操作的应用程序并没有什么意义,因为为了使“粘贴”部分能够工作, 应用程序必须知道该项目将被粘贴的位置。 如果它知道,那么它可以调用你已经知道的SHFileOperation
函数。
如果你真的只是在谈论提供用户剪切/复制/粘贴项目的能力,那么你会想要使用剪贴板 – 就像Windows一样。 当一个项目被剪切或复制时,它被放置在剪贴板上。 当一个项目被粘贴时,剪贴板的当前内容被检索。 使用Windows 剪贴板API函数与剪贴板进行交互。
我在我的文件管理器中实现它, 这里是复制功能的GitHub源的链接 。 粘贴在附近。
它通过为感兴趣的文件系统项目创建一个不可见的资源管理器上下文菜单,然后从该菜单调用剪切,复制或粘贴命令。 这是在C + +(因为COM),但我相信你可以用其他语言的COM以及某种方式。
bool copyObjectsToClipboard(std::vector<std::wstring> objects, void * parentWindow) { ComInitializer comInitializer; IContextMenu * imenu = 0; HMENU hMenu = NULL; if (!prepareContextMenuForObjects(objects, parentWindow, hMenu, imenu) || !hMenu || !imenu) return false; CComInterfaceReleaser menuReleaser(imenu); const char command[] = "Copy"; CMINVOKECOMMANDINFO info = { 0 }; info.cbSize = sizeof(info); info.hwnd = (HWND)parentWindow; info.lpVerb = command; info.nShow = SW_SHOWNORMAL; const auto result = imenu->InvokeCommand((LPCMINVOKECOMMANDINFO)&info); DestroyMenu(hMenu); return SUCCEEDED(result); }