怎么把多个文件或目录复制到剪切板里?

时间:2022-09-14 20:51:40
比如我把多个文件或目录的路径存放到TStringLis里,然后把它们复制到剪切板里,这样当在WIn里点粘贴时,就全部粘贴过来了,

9 个解决方案

#1


你的意思是用程序模拟这个效果么还是什么?

#2


也可以这么说吧

我在程序里的LIstView里有文件目录,当选择多个文件进行复制时,希望能把它放到剪切板里

#3


你把选中的文件路径名字 保存在TStringLis
然后循环TStringLis 获取路径名;
最后用SHFileOperation复制文件夹 或者用CopyFile赋值文件

#4


选中,这样copytocliboard不行?

#5


不行,因为不确定要保存到哪个目录,有可能关了程序用户仍能粘贴,这就应该是保存到剪切板里的

#6


怎么把多个文件或目录复制到剪切板里?
关闭了你的程序,仍能保存?
你的程序都关了 你TStringLis早没了
那你这里 “路径存放到TStringLis里,” 不是瞎扯

#7



//---------------------------------------------------------------------------
//#define NO_WIN32_LEAN_AND_MEAN
//#include <shlobj.h>
bool CopyFilesToClip(TStringList *fileList)
{
   //复制文件到剪切板,对于多个文件,没有参数指定文件个数,
   //每个文件名用 0 分隔,所有文件名结束用 两个0表示
   DROPFILES *dropFiles;
   UINT memLen;
   HGLOBAL Gmem;
   char *pMem,*szFileList;

   //记算所需内存大小。
   memLen=sizeof(DROPFILES);
   for(int i=0;i<fileList->Count;i++)
      memLen+=fileList->Strings[i].Length()+1;
   memLen++; //最后一个0的位置。

   Gmem= GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, memLen);
   pMem=(char*)GlobalLock(Gmem);
   if(pMem==NULL)
   {
      GlobalFree(Gmem);
      return false;
   }

   dropFiles=(DROPFILES*)pMem;
   szFileList=pMem+sizeof(DROPFILES);

   dropFiles->pFiles =sizeof(DROPFILES);
   dropFiles->pt.x=0;
   dropFiles->pt.y=0;
   dropFiles->fNC =false;
   dropFiles->fWide =false;

   int nameLen=0;
   for(int i=0;i<fileList->Count;i++)
   {
      nameLen+=wsprintf(szFileList+nameLen,fileList->Strings[i].c_str());
      nameLen++;//字符结尾0的位置。
   }
   szFileList[nameLen]=0;//最后一个0。

   GlobalUnlock(Gmem);

   if(!OpenClipboard(NULL) )
   {
      GlobalFree(Gmem);
      return false;
   }

   bool retValue=true;

   EmptyClipboard();

   if(NULL==SetClipboardData( CF_HDROP, Gmem ))
      retValue=false;

   CloseClipboard();

   return retValue;
}
//---------------------------------------------------------------------------

#8


感谢 1cctv ,也感谢参与的大大,谢谢

#9


该回复于2012-06-13 16:04:38被版主删除

#1


你的意思是用程序模拟这个效果么还是什么?

#2


也可以这么说吧

我在程序里的LIstView里有文件目录,当选择多个文件进行复制时,希望能把它放到剪切板里

#3


你把选中的文件路径名字 保存在TStringLis
然后循环TStringLis 获取路径名;
最后用SHFileOperation复制文件夹 或者用CopyFile赋值文件

#4


选中,这样copytocliboard不行?

#5


不行,因为不确定要保存到哪个目录,有可能关了程序用户仍能粘贴,这就应该是保存到剪切板里的

#6


怎么把多个文件或目录复制到剪切板里?
关闭了你的程序,仍能保存?
你的程序都关了 你TStringLis早没了
那你这里 “路径存放到TStringLis里,” 不是瞎扯

#7



//---------------------------------------------------------------------------
//#define NO_WIN32_LEAN_AND_MEAN
//#include <shlobj.h>
bool CopyFilesToClip(TStringList *fileList)
{
   //复制文件到剪切板,对于多个文件,没有参数指定文件个数,
   //每个文件名用 0 分隔,所有文件名结束用 两个0表示
   DROPFILES *dropFiles;
   UINT memLen;
   HGLOBAL Gmem;
   char *pMem,*szFileList;

   //记算所需内存大小。
   memLen=sizeof(DROPFILES);
   for(int i=0;i<fileList->Count;i++)
      memLen+=fileList->Strings[i].Length()+1;
   memLen++; //最后一个0的位置。

   Gmem= GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, memLen);
   pMem=(char*)GlobalLock(Gmem);
   if(pMem==NULL)
   {
      GlobalFree(Gmem);
      return false;
   }

   dropFiles=(DROPFILES*)pMem;
   szFileList=pMem+sizeof(DROPFILES);

   dropFiles->pFiles =sizeof(DROPFILES);
   dropFiles->pt.x=0;
   dropFiles->pt.y=0;
   dropFiles->fNC =false;
   dropFiles->fWide =false;

   int nameLen=0;
   for(int i=0;i<fileList->Count;i++)
   {
      nameLen+=wsprintf(szFileList+nameLen,fileList->Strings[i].c_str());
      nameLen++;//字符结尾0的位置。
   }
   szFileList[nameLen]=0;//最后一个0。

   GlobalUnlock(Gmem);

   if(!OpenClipboard(NULL) )
   {
      GlobalFree(Gmem);
      return false;
   }

   bool retValue=true;

   EmptyClipboard();

   if(NULL==SetClipboardData( CF_HDROP, Gmem ))
      retValue=false;

   CloseClipboard();

   return retValue;
}
//---------------------------------------------------------------------------

#8


感谢 1cctv ,也感谢参与的大大,谢谢

#9


该回复于2012-06-13 16:04:38被版主删除