Er der en Windows API til programmatisk Cut/Copy/Paste filer via Windows Stifinder?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg ved, at SHFileOperation kan bruges til at udføre filoperatoner med Windows Stifinder, men det udfører kun komplette filoperationer, hvor både kilden og destinationen er kendt. [4] [5]


Er der en API, der gør det muligt for en applikation at klippe, kopiere eller indsætte i Windows Stifinder fra et program?


At besvare et par spørgsmål:



  • Brug af Windows Stifinder til at udføre fil/mappe operationer vil i høj grad forenkle flytte flere objekter. Dette er især vigtigt for flytning af mapper og deres indhold, da MoveFile ikke understøtter bevægelige mapper til forskellige mængder.

  • Hvis du bruger Windows Stifinder til at udføre fil/mappe-operationer, vil operationerne blive tilføjet til Windows Stifinderens undo-buffer, så de kan fortrydes, ellers kan operationer udført med konsolprogrammer/kommandoprompten ikke fortrydes.



Jeg er sikker på, at jeg har set det muligt at udføre Windows Explorer-verber programmatisk, men jeg kan ikke synes at finde en måde at gøre det for disse.

Bedste reference


Det er svært at forestille sig, hvorfor en sådan funktion ville eksistere, eller hvor god det ville være, hvis det gjorde det.


Klipp/kopi og indsæt er til gavn for bruger . Det giver dem mulighed for at flytte/kopiere noget et andet sted på et senere tidspunkt. Programmet, der implementerer klippe/kopiere og indsætte funktionalitet, kan ikke vide, hvor dataene i sidste ende bliver klistret, men det er okay, fordi brugeren stadig ved.


Men en applikation gør en cut/copy-paste-handling gør ikke meget fornuft, fordi for at 'pasta' -delen skal virke, skal programmet kende hvor emnet skal klistes. Og hvis det ved det, kunne det bare kalde funktionen SHFileOperation, som du allerede ved. [6]


Hvis du bare taler om at give brugeren mulighed for at klippe/kopiere/indsætte et emne, så vil du bruge klippebordet - ligesom Windows gør. Når et emne er skåret eller kopieret, placeres det på udklipsholderen. Når et emne er klistret, hentes det aktuelle indhold på udklipsholderen. Brug API-funktionerne til Windows til at interagere med udklipsholderen. [7]

Andre referencer 1


Jeg har implementeret det i min filhåndtering, her er linket til GitHub-kilden til kopieringsfunktionen. Indsæt er i nærheden. [8]


Det virker ved at oprette en usynlig Explorer-kontekstmenu for de filsystemer, der er af interesse, og derefter påkoble kommandoen Klipp, Kopier eller Indsæt fra den menu. Det er i C ++ (fordi COM), men jeg er sikker på at du også kan bruge COM fra andre sprog.


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);
}