我知道SHFileOperation可以用于在Windows资源管理器中执行文件操作,但它只在已知源和目标的情况下执行完整的文件操作。
是否有API允许应用程序从应用程序剪切、复制或粘贴到Windows资源管理器中?
回答几个问题:
-
使用Windows资源管理器执行文件/文件夹操作将大大简化移动多个对象的过程。这对于移动文件夹及其内容尤其重要,因为
MoveFile
不支持将文件夹移动到不同的卷。 -
使用Windows资源管理器执行文件/文件夹操作将允许将这些操作添加到Windows资源管理局的撤消缓冲区中,以便可以撤消这些操作,否则无法撤消使用控制台应用程序/命令提示符执行的操作。
我确信我已经看到了以编程方式执行Windows资源管理器谓词的可能性,但我似乎找不到这样做的方法。
很难想象为什么会存在这样的函数,或者如果存在会有什么好处。
提供剪切/复制和粘贴是为了用户的方便。它允许他们在以后的某个日期将某个东西移动/复制到其他地方。实现剪切/复制和粘贴功能的应用程序可能不知道数据最终要粘贴到哪里,但这没关系,因为用户仍然知道。
但是,应用程序执行剪切/复制粘贴操作没有多大意义,因为为了"粘贴"部分工作,application必须知道项目要粘贴到哪里。如果它知道这一点,那么它就可以调用你已经知道的SHFileOperation
函数。
如果你真的只是在谈论为用户提供剪切/复制/粘贴项目的能力,那么你会想使用剪贴板——就像Windows一样。剪切或复制项目时,会将其放置在剪贴板上。粘贴项目时,将检索剪贴板的当前内容。使用Windows剪贴板API函数与剪贴板进行交互。
我在我的文件管理器中实现了它,这是复制函数的GitHub源代码链接。粘贴就在附近。
它的工作方式是为感兴趣的文件系统项创建一个不可见的Explorer上下文菜单,然后从该菜单中调用"剪切"、"复制"或"粘贴"命令。它是用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);
}
// https://learn.microsoft.com/ja-jp/windows/desktop/dataxchg/standard-clipboard-formats
const char* wichStandardClipboardFormatsIsAvailable()
{
// Standard Clipboard Formats
// CF_BITMAP : 2
// CF_DIB : 8
// CF_DIBV5 :17
// CF_DIF : 5
// CF_DSPBITMAP :0x0082
// CF_DSPENHMETAFILE :0x008E
// CF_DSPMETAFILEPICT :0x0082
// CF_DSPTEXT :0x0081
// CF_ENHMETAFILE :14
// CF_GDIOBJFIRST :0x0300
// CF_GDIOBJLAST :0x03FF
// CF_HDROP :15
// CF_LOCALE :16
// CF_METAFILEPICT :3
// CF_OEMTEXT :7
// CF_OWNERDISPLAY :0x0080
// CF_PALETTE :9
// CF_PENDATA :10
// CF_PRIVATEFIRST :0x0200
// CF_PRIVATELAST :0x02FF
// CF_RIFF :11
// CF_SYLK :4
// CF_TEXT :1
// CF_TIFF :6
// CF_UNICODETEXT :13
// CF_PRIVATELAST :0x02FF
// CF_WAVE :12
if ( IsClipboardFormatAvailable(CF_BITMAP) ) {
return "CF_BITMAP";
}
if ( IsClipboardFormatAvailable(CF_DIB) ) {
return "CF_DIB";
}
if ( IsClipboardFormatAvailable(CF_DIBV5) ) {
return "CF_DIBV5";
}
if ( IsClipboardFormatAvailable(CF_DIF) ) {
return "CF_DIF";
}
if ( IsClipboardFormatAvailable(CF_DSPBITMAP) ) {
return "CF_DSPBITMAP";
}
if ( IsClipboardFormatAvailable(CF_DSPENHMETAFILE) ) {
return "CF_DSPENHMETAFILE";
}
if ( IsClipboardFormatAvailable(CF_DSPMETAFILEPICT) ) {
return "CF_DSPMETAFILEPICT";
}
if ( IsClipboardFormatAvailable(CF_HDROP) ) {
return "CF_HDROP";
}
if ( IsClipboardFormatAvailable(CF_GDIOBJFIRST) ) {
return "CF_GDIOBJFIRST";
}
if ( IsClipboardFormatAvailable(CF_GDIOBJLAST) ) {
return "CF_GDIOBJLAST";
}
if ( IsClipboardFormatAvailable(CF_HDROP) ) {
return "CF_HDROP";
}
if ( IsClipboardFormatAvailable(CF_LOCALE) ) {
return "CF_LOCALE";
}
if ( IsClipboardFormatAvailable(CF_METAFILEPICT) ) {
return "CF_METAFILEPICT";
}
if ( IsClipboardFormatAvailable(CF_OEMTEXT) ) {
return "CF_OEMTEXT";
}
if ( IsClipboardFormatAvailable(CF_OWNERDISPLAY) ) {
return "CF_OWNERDISPLAY";
}
if ( IsClipboardFormatAvailable(CF_PALETTE) ) {
return "CF_PALETTE";
}
if ( IsClipboardFormatAvailable(CF_RIFF) ) {
return "CF_RIFF";
}
if ( IsClipboardFormatAvailable(CF_BITMAP) ) {
return "CF_SYLK";
}
if ( IsClipboardFormatAvailable(CF_BITMAP) ) {
return "CF_TEXT";
}
if ( IsClipboardFormatAvailable(CF_BITMAP) ) {
return "CF_UNICODETEXT";
}
if ( IsClipboardFormatAvailable(CF_BITMAP) ) {
return "CF_PRIVATELAST";
}
if ( IsClipboardFormatAvailable(CF_BITMAP) ) {
return "CF_WAVE";
}
return "CF_NOT_STANDARD";
}
https://github.com/WaitrudWeber/source_zip/blob/master/winmain-20190111.zip
- 执行winmain_001.exe
- 在浏览中复制文件
- 按ctl,然后按v
- 可以看到CF_HDROP
您可以看到函数:wichStandardClipboardFormatsIs在winmain_001.cpp中可用和https://learn.microsoft.com/ja-jp/windows/desktop/dataxchg/standard-clipboard-formats
有一次我把你说错了,我很抱歉。