Accessing+the+Shell+Clipboard

//by Richard Russell, October 2010//


 * Windows Explorer** lets you copy files from one place in the filesystem to another (e.g. from one folder to another, or from one drive to another) by means of **Copy** and **Paste** operations, analogous to how you might copy-and-paste text from one document to another. This article describes how you can access the **Shell Clipboard** from your BASIC program, so you can **paste** files that have been copied in Windows Explorer, or **copy** files that can then be pasted in Windows Explorer.

code format="bb4w" CF_HDROP = 15 MAX_PATH = 260 DIM Buffer% MAX_PATH SYS "IsClipboardFormatAvailable", CF_HDROP TO res% IF res% THEN SYS "OpenClipboard", @hwnd% SYS "GetClipboardData", CF_HDROP TO hdata% IF hdata% THEN SYS "GlobalLock", hdata% TO hdropfiles% SYS "DragQueryFile", hdropfiles%, -1, 0, 0 TO nfiles% IF nfiles% THEN FOR I% = 0 TO nfiles%-1 SYS "DragQueryFile", hdropfiles%, I%, Buffer%, MAX_PATH PRINT $$Buffer% NEXT I%         ENDIF SYS "DragFinish", hdropfiles% SYS "GlobalUnlock", hdata% ENDIF SYS "CloseClipboard" ENDIF code Here the filenames are simply printed to the screen. In practice you are likely to want to copy the files and/or to access their contents.
 * Pasting** files from the Shell Clipboard uses a similar mechanism to that described in the article Receiving dropped files. The following code checks to see if there are any files on the Shell Clipboard and if so accesses them:

code format="bb4w" CF_HDROP = 15 GMEM_ZEROINIT = &40 GMEM_DDESHARE = &2000 MAXFILES = 100 DIM file$(MAXFILES) DIM dropfiles{pFiles%, pt{x%,y%}, fNC%, fWide%} nfiles% = FNselectfiles("Select one or more files", "*.*", file$) IF nfiles% THEN size% = DIM(dropfiles{}) + SUMLEN(file$) + nfiles% + 1 SYS "GlobalAlloc", GMEM_DDESHARE + GMEM_ZEROINIT, size% TO hdata% SYS "GlobalLock", hdata% TO mem% !mem% = DIM(dropfiles{}) P% = mem% + !mem% FOR I% = 1 TO nfiles% $$P% = file$(I%) P% += LEN(file$(I%)) + 1 NEXT SYS "GlobalUnlock", hdata% SYS "OpenClipboard", @hwnd% SYS "EmptyClipboard" SYS "SetClipboardData", CF_HDROP, hdata% SYS "CloseClipboard" ENDIF code
 * Copying** files to the Shell Clipboard is slightly more involved, because you have to build the necessary data structure yourself. The code to do it is listed below; for convenience it uses the **FNselectfiles** function, to be found in the article Selecting multiple files, to select the file(s) to be copied: