是否有Windows API可以通过Windows资源管理器以编程方式剪切/复制/粘贴文件



我知道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

  1. 执行winmain_001.exe
  2. 在浏览中复制文件
  3. 按ctl,然后按v
  4. 可以看到CF_HDROP

您可以看到函数:wichStandardClipboardFormatsIs在winmain_001.cpp中可用和https://learn.microsoft.com/ja-jp/windows/desktop/dataxchg/standard-clipboard-formats

有一次我把你说错了,我很抱歉。

最新更新