Существует ли Windows API для программного вырезания / копирования / вставки файлов через проводник Windows? - PullRequest
9 голосов
/ 23 марта 2012

Я знаю, что SHFileOperation можно использовать для выполнения операций с файлами с Windows Explorer , но он выполняет только полные операции с файлами, когда известны и источник, и пункт назначения.

Существует ли API, который позволяет приложению вырезать, копировать или вставлять в проводнике Windows из приложения?

Чтобы ответить на пару вопросов:

* * 1010

Использование проводника Windows для выполнения операций с файлами / папками значительно упростит перемещение нескольких объектов. Это особенно важно для перемещения папок и их содержимого, поскольку MoveFile не поддерживает перемещение папок на разные тома.

Использование Windows Explorer для выполнения операций с файлами / папками позволило бы добавить операции в буфер отмены Windows Explorer, чтобы их можно было отменить, в противном случае операции, выполняемые с консольными приложениями / командной строкой, не могут быть отменены.

Я уверен, что видел возможность программно выполнять глаголы Windows Explorer, но, похоже, я не могу найти способ сделать это для них.

Ответы [ 3 ]

1 голос
/ 27 декабря 2015

Я реализовал это в своем файловом менеджере, вот ссылка на источник 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);
}
1 голос
/ 24 марта 2012

Сложно представить, почему такая функция существует или какая она будет полезной, если она будет.

Для удобства пользователя предусмотрены функции вырезания / копирования и вставки.Это позволяет им перемещать / копировать что-то еще в более позднее время.Приложение, которое реализует функции вырезания / копирования и вставки, может не знать, куда в конечном итоге будут вставлены данные, но это нормально, потому что пользователь все еще знает.

Но приложение выполнение действия вырезания / копирования-вставки не имеет большого смысла, потому что для того, чтобы часть «вставка» работала, приложение должно знать, куда будет вставлен элемент,И если он знает это, то может просто вызвать функцию SHFileOperation, о которой вы уже знаете.

Если вы на самом деле просто говорите о том, чтобы предоставить пользователю возможность вырезать / копировать / вставлять элемент, тогда вы захотите использовать буфер обмена - так же, как это делает Windows.Когда элемент вырезан или скопирован, он помещается в буфер обмена.Когда элемент вставлен, текущее содержимое буфера обмена извлекается.Для взаимодействия с буфером обмена используйте функции API буфера обмена Windows .

0 голосов
/ 11 января 2019
// https://docs.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

вы видите функцию: wichStandardClipboardFormatsIsAvailable в winmain_001.cpp и https://docs.microsoft.com/ja-jp/windows/desktop/dataxchg/standard-clipboard-formats

как только я скучаю по тебе и мне так жаль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...