=====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.\\ \\ **Pasting** files from the Shell Clipboard uses a similar mechanism to that described in the article [[/Receiving%20dropped%20files|Receiving dropped files]]. The following code checks to see if there are any files on the Shell Clipboard and if so accesses them:\\
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
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.\\ \\ **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%20multiple%20files|Selecting multiple files]], to select the file(s) to be copied:\\
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