如何将文件从自己的应用软件里拖拽或“复制”“粘贴”到windows资源管理器里? ( 积分: 200 )

  • 主题发起人 主题发起人 hehanyang
  • 开始时间 开始时间
H

hehanyang

Unregistered / Unconfirmed
GUEST, unregistred user!
我的一个办公管理软件里要用到上传下载文件到数据库里,为了操作方便,用户可以使用拖拽和复制,实现与windows的资源管理器方便结合。<br>如果在windows的资源管理器里选择几个文件后点了“复制”,到我的应用程序里要粘贴,我可以得到这些文件名,然后自己写代码把这些文件上传到服务器上去就可以了。这一步好实现我已经做出来了。但是反过来,如果在我的应用程序里选择了几个文件名后点了“复制”,如何在windows的资源管理器里点“粘贴”时将文件从服务器里下载到“粘贴”的目录里呢?<br>哪位高手知道呢?我现在的笨方法是:当在点了“复制”后,就立即将文件输出到临时目录,然后<br>用下面给出的ClipCutOrCopyFiles函数将文件名传给windows的资源管理器,问题是如果用户不“粘贴”了呢?岂不是白白输出文件浪费资源了吗?<br>type<br>DROPFILES&nbsp;=&nbsp;record<br>&nbsp;&nbsp;&nbsp;pFiles&nbsp;:DWORD&nbsp;;&nbsp;//&nbsp;offset&nbsp;of&nbsp;file&nbsp;list<br>&nbsp;&nbsp;&nbsp;pt&nbsp;:&nbsp;TPOINT&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;drop&nbsp;point&nbsp;(coordinates&nbsp;depend&nbsp;on&nbsp;fNC)<br>&nbsp;&nbsp;&nbsp;fNC&nbsp;:&nbsp;BOOLean&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;see&nbsp;below<br>&nbsp;&nbsp;&nbsp;fWide&nbsp;:&nbsp;BOOLean&nbsp;;&nbsp;&nbsp;&nbsp;//&nbsp;TRUE&nbsp;if&nbsp;file&nbsp;contains&nbsp;wide&nbsp;characters,<br>end;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;FALSE&nbsp;otherwise<br>LPDROPFILES&nbsp;=&nbsp;^DROPFILES;<br><br>const&nbsp;DROPEFFECT_COPY&nbsp;=&nbsp;1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DROPEFFECT_MOVE&nbsp;=&nbsp;2;<br><br>procedure&nbsp;ClipCutOrCopyFiles(lpFiles:Pchar;uBufLen:UINT;&nbsp;bCopy:boolean);<br>var&nbsp;uDropEffect,uGblLen,&nbsp;uDropFilesLen:&nbsp;UINT&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;dpFiles&nbsp;:&nbsp;DROPFILES;<br>&nbsp;&nbsp;&nbsp;&nbsp;hGblFiles,hGblEffect:HGLOBAL;<br>&nbsp;&nbsp;&nbsp;&nbsp;szData,szFileList&nbsp;:Pchar;<br>&nbsp;&nbsp;&nbsp;&nbsp;dwDropEffect&nbsp;:&nbsp;PDword;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uDropEffect:=RegisterClipboardFormat('Preferred&nbsp;DropEffect');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hGblEffect:=GlobalAlloc(GMEM_ZEROINIT&nbsp;or&nbsp;GMEM_MOVEABLE&nbsp;or&nbsp;GMEM_DDESHARE,sizeof(DWORD));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwDropEffect:=GlobalLock(hGblEffect);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(bCopy)&nbsp;&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwDropEffect^:=DROPEFFECT_COPY<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwDropEffect^:=DROPEFFECT_MOVE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GlobalUnlock(hGblEffect);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uDropFilesLen:=sizeof(DROPFILES);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dpFiles.pFiles&nbsp;:=uDropFilesLen;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dpFiles.pt.x:=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dpFiles.pt.y:=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dpFiles.fNC&nbsp;:=FALSE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dpFiles.fWide&nbsp;:=&nbsp;TRUE&nbsp;;&nbsp;//&nbsp;&nbsp;&nbsp;False;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uGblLen:=uDropFilesLen+uBufLen*2+8;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hGblFiles:=&nbsp;GlobalAlloc(GMEM_ZEROINIT&nbsp;or&nbsp;GMEM_MOVEABLE&nbsp;or&nbsp;GMEM_DDESHARE,&nbsp;uGblLen);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;szData:=GlobalLock(hGblFiles);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;copymemory(szData,(@dpFiles),uDropFilesLen);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;szFileList:=szData+uDropFilesLen;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MultiByteToWideChar(CP_ACP,MB_COMPOSITE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpFiles,uBufLen,PWCHAR(&nbsp;szFileList),uBufLen);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GlobalUnlock(hGblFiles);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;OpenClipboard(0)&nbsp;)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EmptyClipboard();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetClipboardData(&nbsp;CF_HDROP,&nbsp;hGblFiles&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetClipboardData(uDropEffect,hGblEffect);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseClipboard();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>end;
 
guanzhu....
 
怎么没有人回答呢?我继续等。<br>大家用Delphi写软件不要只是使用数据库控件写纯数据库方面的软件,它同样可以写深层次的工具软件。在你的数据库软件里加一些“高级”一点的操作,你的软件档次就提高了。比如拖拽、复制、树结构显示、实时通讯(如业务员提交清单后给审批领导发一个消息)、视频显示、图像处理等。望各位高手给于指点。
 
我使用的是DoDragDrop函数,这个函数有返回值可以判断是否已经粘贴了。<br>原理和你的实现是一样的,也是将文件先拷贝到临时目录。
 
to&nbsp;TrustMe:能具体一点说明一下DoDragDrop函数的使用吗?是不是复制以后就调用DoDragDrop函数?这个函数是堵塞模式还是有回调事件让我知道已经“粘贴”了呢?最好给一段例子代码。谢谢。
 
不需要用临时目录,可以直接拷贝到剪贴版的(当然只是文件信息)<br>具体你看一下SetClipboardData&nbsp;函数就知道了
 
to&nbsp;maze:<br>如果不先将文件输出到临时目录而只将文件信息输出到剪贴板,则资源管理器的“粘贴”菜单是灰的。而且我不知道何时资源管理器已经点了“粘贴”菜单。
 
我是直接用&nbsp;TDropDrag&nbsp;控件完成的,效果不错<br>www.2ccc.com&nbsp;有下
 
我只能给你一部分代码:这段代码只是缺少IDataObject和IDropSource的声明,实现部分我提供给你。<br>procedure&nbsp;TMainFm.List1MouseDown(Sender:&nbsp;TObject;&nbsp;Button:&nbsp;TMouseButton;<br>&nbsp;&nbsp;Shift:&nbsp;TShiftState;&nbsp;X,&nbsp;Y:&nbsp;Integer);<br>begin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;Fmousedown:=&nbsp;Assigned(list1.GetItemAt(X,&nbsp;Y));<br>end;<br><br>procedure&nbsp;TMainFm.List1MouseMove(Sender:&nbsp;TObject;&nbsp;Shift:&nbsp;TShiftState;&nbsp;X,<br>&nbsp;&nbsp;Y:&nbsp;Integer);<br>var<br>&nbsp;effect:&nbsp;integer;<br>begin<br>&nbsp;if&nbsp;Fmousedown&nbsp;and&nbsp;(list1.SelCount&nbsp;&gt;&nbsp;0)&nbsp;then&nbsp;begin<br>&nbsp;&nbsp;effect:=&nbsp;DROPEFFECT_NONE;<br>&nbsp;&nbsp;DoDragDrop(self,&nbsp;Self,&nbsp;DROPEFFECT_MOVE,&nbsp;effect);<br>&nbsp;&nbsp;//&nbsp;TODO&nbsp;:&nbsp;在这里判断effect的值是否等于&nbsp;DROPEFFECT_MOVE<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;Fmousedown:=&nbsp;False;<br>&nbsp;end;<br>end;<br><br>procedure&nbsp;TMainFm.List1MouseUp(Sender:&nbsp;TObject;&nbsp;Button:&nbsp;TMouseButton;<br>&nbsp;&nbsp;Shift:&nbsp;TShiftState;&nbsp;X,&nbsp;Y:&nbsp;Integer);<br>begin<br>&nbsp;Fmousedown:=&nbsp;False;<br>end;<br><br>&nbsp;{&nbsp;IEnumFormatEtc&nbsp;}<br>type<br>&nbsp;TEnumFormatEtc&nbsp;=&nbsp;class(TInterfacedObject,&nbsp;IEnumFormatEtc)<br>&nbsp;private<br>&nbsp;&nbsp;Ffetched:&nbsp;boolean;<br>&nbsp;public<br>&nbsp;&nbsp;function&nbsp;Next(celt:&nbsp;Longint;&nbsp;out&nbsp;elt;<br>&nbsp;&nbsp;&nbsp;&nbsp;pceltFetched:&nbsp;PLongint):&nbsp;HResult;&nbsp;stdcall;<br>&nbsp;&nbsp;function&nbsp;Skip(celt:&nbsp;Longint):&nbsp;HResult;&nbsp;stdcall;<br>&nbsp;&nbsp;function&nbsp;Reset:&nbsp;HResult;&nbsp;stdcall;<br>&nbsp;&nbsp;function&nbsp;Clone(out&nbsp;Enum:&nbsp;IEnumFormatEtc):&nbsp;HResult;&nbsp;stdcall;<br>&nbsp;end;<br><br>function&nbsp;TEnumFormatEtc.Next(celt:&nbsp;Longint;&nbsp;out&nbsp;elt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pceltFetched:&nbsp;PLongint):&nbsp;HResult;<br>begin<br>&nbsp;result:=&nbsp;S_FALSE;<br>&nbsp;if&nbsp;(not&nbsp;Ffetched)&nbsp;and&nbsp;(celt&nbsp;&gt;&nbsp;0)&nbsp;and&nbsp;(@elt&nbsp;&lt;&gt;&nbsp;nil)&nbsp;then&nbsp;begin<br>&nbsp;&nbsp;PFormatEtc(@elt)^.cfFormat:=&nbsp;CF_HDROP;<br>&nbsp;&nbsp;PFormatEtc(@elt)^.ptd:=&nbsp;nil;<br>&nbsp;&nbsp;PFormatEtc(@elt)^.dwAspect:=&nbsp;DVASPECT_CONTENT;<br>&nbsp;&nbsp;PFormatEtc(@elt)^.lindex:=&nbsp;-1;<br>&nbsp;&nbsp;PFormatEtc(@elt)^.tymed:=&nbsp;TYMED_HGLOBAL;<br>&nbsp;&nbsp;if&nbsp;pceltFetched&nbsp;&lt;&gt;&nbsp;nil&nbsp;then<br>&nbsp;&nbsp;&nbsp;pceltFetched^:=&nbsp;1;<br>&nbsp;&nbsp;result:=&nbsp;S_OK;<br>&nbsp;&nbsp;Ffetched:=&nbsp;True;<br>&nbsp;end;<br>end;<br><br>function&nbsp;TEnumFormatEtc.Skip(celt:&nbsp;Longint):&nbsp;HResult;<br>begin<br>&nbsp;if&nbsp;(Ffetched&nbsp;and&nbsp;(celt&nbsp;&gt;&nbsp;0))&nbsp;or&nbsp;((not&nbsp;Ffetched)&nbsp;and&nbsp;(celt&nbsp;&gt;&nbsp;1))&nbsp;then<br>&nbsp;&nbsp;result:=&nbsp;S_FALSE<br>&nbsp;else&nbsp;result:=&nbsp;S_OK;<br>&nbsp;Ffetched:=&nbsp;True;<br>end;<br><br>function&nbsp;TEnumFormatEtc.Reset:&nbsp;HResult;<br>begin<br>&nbsp;Ffetched:=&nbsp;False;<br>&nbsp;result:=&nbsp;S_OK;<br>end;<br><br>function&nbsp;TEnumFormatEtc.Clone(out&nbsp;Enum:&nbsp;IEnumFormatEtc):&nbsp;HResult;<br>begin<br>&nbsp;Enum:=&nbsp;TEnumFormatEtc.Create;<br>&nbsp;result:=&nbsp;S_OK;<br>end;<br><br>&nbsp;{&nbsp;TODO&nbsp;:&nbsp;IDataObject&nbsp;}<br><br>function&nbsp;TMainFm.QueryGetData(const&nbsp;formatetc:&nbsp;TFormatEtc):&nbsp;HResult;<br>begin<br>&nbsp;result:=&nbsp;DV_E_FORMATETC;<br>&nbsp;if&nbsp;(formatetc.cfFormat&nbsp;=&nbsp;CF_HDROP)&nbsp;and&nbsp;&nbsp;//表示支持文件拖拽格式<br>&nbsp;&nbsp;&nbsp;&nbsp;(formatetc.tymed&nbsp;=&nbsp;TYMED_HGLOBAL)&nbsp;and<br>&nbsp;&nbsp;&nbsp;&nbsp;(formatetc.dwAspect&nbsp;=&nbsp;DVASPECT_CONTENT)&nbsp;then<br>&nbsp;&nbsp;result:=&nbsp;S_OK;<br>end;<br><br>function&nbsp;TMainFm.GetData(const&nbsp;formatetcIn:&nbsp;TFormatEtc;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out&nbsp;medium:&nbsp;TStgMedium):&nbsp;HResult;<br>var<br>&nbsp;BufferText&nbsp;:&nbsp;String;<br>&nbsp;pGlobal&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Pointer;<br>&nbsp;i:&nbsp;integer;<br>&nbsp;fb:&nbsp;TFileBaseObj;<br>&nbsp;l:&nbsp;TListItem;<br>&nbsp;s:&nbsp;string;<br>begin<br>&nbsp;result:=&nbsp;DV_E_FORMATETC;&nbsp;//不支持的格式<br>&nbsp;if&nbsp;Failed(QueryGetData(formatetcIn))&nbsp;then&nbsp;Exit;<br>&nbsp;BufferText:=&nbsp;'';<br>&nbsp;ZeroMemory(@medium,&nbsp;SizeOf(TStgMedium));<br>&nbsp;medium.tymed:=&nbsp;formatetcIn.tymed;<br>&nbsp;for&nbsp;i:=&nbsp;0&nbsp;to&nbsp;list1.Items.Count&nbsp;-&nbsp;1&nbsp;do&nbsp;begin<br>&nbsp;&nbsp;l:=&nbsp;list1.Items;<br>&nbsp;&nbsp;if&nbsp;l.Selected&nbsp;then&nbsp;begin<br>&nbsp;&nbsp;&nbsp;fb:=&nbsp;TFileBaseObj(l.Data);<br>&nbsp;&nbsp;&nbsp;if&nbsp;fb&nbsp;=&nbsp;nil&nbsp;then&nbsp;fb:=&nbsp;trmObj.fileSys.selectFile(PChar(FcurDir&nbsp;+&nbsp;'/'&nbsp;+&nbsp;string(l.Caption)));<br>&nbsp;&nbsp;&nbsp;if&nbsp;fb&nbsp;&lt;&gt;&nbsp;nil&nbsp;then&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;l.Data:=&nbsp;fb;<br>&nbsp;&nbsp;&nbsp;&nbsp;BufferText:=&nbsp;BufferText&nbsp;+&nbsp;FtempDir&nbsp;+&nbsp;'/'&nbsp;+&nbsp;string(fb.name)&nbsp;+&nbsp;#0;<br>&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br>&nbsp;end;<br>&nbsp;//&nbsp;只拷贝文件名<br>&nbsp;BufferText:=&nbsp;BufferText&nbsp;+&nbsp;#0;<br><br>&nbsp;Medium.hGlobal:=&nbsp;GlobalAlloc(GMEM_ZEROINIT&nbsp;or&nbsp;GMEM_MOVEABLE&nbsp;or&nbsp;GMEM_SHARE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Length(BufferText)&nbsp;+&nbsp;Sizeof(TDropFiles));<br>&nbsp;pGlobal:=&nbsp;GlobalLock(Medium.hGlobal);<br>&nbsp;if&nbsp;pGlobal&nbsp;&lt;&gt;&nbsp;nil&nbsp;then&nbsp;try<br>&nbsp;&nbsp;PDropFiles(pGlobal)^.pFiles:=&nbsp;Sizeof(TDropFiles);<br>&nbsp;&nbsp;PDropFiles(pGlobal)^.pt:=&nbsp;Point(0,&nbsp;0);<br>&nbsp;&nbsp;PDropFiles(pGlobal)^.fNC:=&nbsp;False;<br>&nbsp;&nbsp;PDropFiles(pGlobal)^.fWide:=&nbsp;False;<br>&nbsp;&nbsp;Inc(Longword(pGlobal),&nbsp;Sizeof(TDropFiles));&nbsp;//指针后移<br>&nbsp;&nbsp;CopyMemory(PGlobal,&nbsp;@BufferText[1],&nbsp;Length(BufferText));<br>&nbsp;finally<br>&nbsp;&nbsp;GlobalUnlock(Medium.hGlobal);<br>&nbsp;end;<br>&nbsp;Medium.unkForRelease&nbsp;:=&nbsp;nil;<br>&nbsp;result:=&nbsp;S_OK;<br>end;<br><br>function&nbsp;TMainFm.EnumFormatEtc(dwDirection:&nbsp;Longint;&nbsp;out&nbsp;enumFormatEtc:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IEnumFormatEtc):&nbsp;HResult;<br>begin<br>&nbsp;if&nbsp;dwDirection&nbsp;=&nbsp;DATADIR_GET&nbsp;then&nbsp;begin<br>&nbsp;&nbsp;enumFormatEtc:=&nbsp;TEnumFormatEtc.Create;<br>&nbsp;&nbsp;result:=&nbsp;S_OK;<br>&nbsp;end&nbsp;else&nbsp;begin<br>&nbsp;&nbsp;enumFormatEtc:=&nbsp;nil;<br>&nbsp;&nbsp;Result:=&nbsp;E_NOTIMPL;<br>&nbsp;end;<br>end;<br><br>function&nbsp;TMainFm.GetDataHere(const&nbsp;formatetc:&nbsp;TFormatEtc;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out&nbsp;medium:&nbsp;TStgMedium):&nbsp;HResult;<br>begin<br>&nbsp;result:=&nbsp;E_NOTIMPL;<br>end;<br><br>function&nbsp;TMainFm.GetCanonicalFormatEtc(const&nbsp;formatetc:&nbsp;TFormatEtc;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out&nbsp;formatetcOut:&nbsp;TFormatEtc):&nbsp;HResult;<br>begin<br>&nbsp;formatetcOut.ptd:=&nbsp;nil;<br>&nbsp;result:=&nbsp;E_NOTIMPL;<br>end;<br><br>function&nbsp;TMainFm.SetData(const&nbsp;formatetc:&nbsp;TFormatEtc;&nbsp;var&nbsp;medium:&nbsp;TStgMedium;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fRelease:&nbsp;BOOL):&nbsp;HResult;<br>begin<br>&nbsp;result:=&nbsp;E_NOTIMPL;<br>end;<br><br>function&nbsp;TMainFm.DAdvise(const&nbsp;formatetc:&nbsp;TFormatEtc;&nbsp;advf:&nbsp;Longint;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;advSink:&nbsp;IAdviseSink;&nbsp;out&nbsp;dwConnection:&nbsp;Longint):&nbsp;HResult;<br>begin<br>&nbsp;result:=&nbsp;OLE_E_ADVISENOTSUPPORTED;<br>end;<br><br>function&nbsp;TMainFm.DUnadvise(dwConnection:&nbsp;Longint):&nbsp;HResult;<br>begin<br>&nbsp;result:=&nbsp;OLE_E_ADVISENOTSUPPORTED;<br>end;<br><br>function&nbsp;TMainFm.EnumDAdvise(out&nbsp;enumAdvise:&nbsp;IEnumStatData):&nbsp;HResult;<br>begin<br>&nbsp;result:=&nbsp;OLE_E_ADVISENOTSUPPORTED;<br>end;<br><br>&nbsp;{&nbsp;TODO&nbsp;:&nbsp;&nbsp;IDropSource&nbsp;}<br><br>function&nbsp;TMainFm.QueryContinueDrag(fEscapePressed:&nbsp;BOOL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grfKeyState:&nbsp;Longint):&nbsp;HResult;<br>var<br>&nbsp;ow:&nbsp;TtrustConfirmResult;<br>&nbsp;i:&nbsp;integer;<br>&nbsp;l:&nbsp;TListItem;<br>&nbsp;fb:&nbsp;TFileBaseObj;<br>begin<br>&nbsp;result:=&nbsp;S_OK;<br>&nbsp;if&nbsp;fEscapePressed&nbsp;or&nbsp;(grfKeyState&nbsp;and&nbsp;MK_RBUTTON&nbsp;=&nbsp;MK_RBUTTON)&nbsp;then<br>&nbsp;&nbsp;result:=&nbsp;DRAGDROP_S_CANCEL<br>&nbsp;else&nbsp;if&nbsp;grfKeyState&nbsp;and&nbsp;MK_LBUTTON&nbsp;=&nbsp;0&nbsp;then&nbsp;begin<br>&nbsp;&nbsp;for&nbsp;i:=&nbsp;0&nbsp;to&nbsp;List1.Items.Count&nbsp;-&nbsp;1&nbsp;do&nbsp;begin<br>&nbsp;&nbsp;&nbsp;l:=&nbsp;list1.Items;<br>&nbsp;&nbsp;&nbsp;if&nbsp;l.Selected&nbsp;then&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;fb:=&nbsp;TFileBaseObj(l.Data);<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;fb&nbsp;&lt;&gt;&nbsp;nil&nbsp;then&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ow:=&nbsp;trcrAllYes;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;解压数据<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trmObj.inflate(fb,&nbsp;@FtempDir[1],&nbsp;ow,&nbsp;True);<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;result:=&nbsp;DRAGDROP_S_DROP;<br>&nbsp;end;<br>end;<br><br>function&nbsp;TMainFm.GiveFeedback(dwEffect:&nbsp;Longint):&nbsp;HResult;&nbsp;<br>begin<br>&nbsp;result:=&nbsp;DRAGDROP_S_USEDEFAULTCURSORS;<br>end;
 
to&nbsp;TrustMe:<br>你所给的代码只能实现拖拽功能,却不能实现在自己的软件里点“复制”按钮后,到windows资源管理器里点“粘贴”菜单的功能。<br>就是拖拽也还存在问题:下面的代码里<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>function&nbsp;TMainFm.GetData(const&nbsp;formatetcIn:&nbsp;TFormatEtc;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out&nbsp;medium:&nbsp;TStgMedium):&nbsp;HResult;<br>&nbsp;&nbsp;&nbsp;......<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferText:=&nbsp;BufferText&nbsp;+&nbsp;FtempDir&nbsp;+&nbsp;'/'&nbsp;+&nbsp;string(fb.name)&nbsp;+&nbsp;#0;<br>&nbsp;&nbsp;&nbsp;.......<br>&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>如果源文件“FtempDir&nbsp;+&nbsp;'/'&nbsp;+&nbsp;string(fb.name)”是不存在的,要等待从自己的软件里将数据输出后才有的,那么资源管理器就不会接受这个文件。<br><br>winrar软件也没有从它的软件里选择文件复制的功能,只有拖拽功能。我发现当将文件从winrar软件里拖出时,winrar先解压数据到临时文件夹,然后windows再将它复制文件到拖出的那个文件夹。<br><br>winrar软件都没有实现的功能,我们难道就一定无法实现吗?使用IE浏览器访问FTP时就可以这样做(在IE里选择文件后复制,然后到资源管理器里粘贴,粘贴时才从FTP站点下载文件,而且直接到目的文件夹)。
 
我给的代码,我使着没问题。<br>在GetData中只输出文件名没错,但浏览器接受。<br>数据输出是在QueryContinueDrag中实现的,这时候拖曳已经完成。<br>总不能,鼠标一开始拖就输出文件数据吧,如果数据输出了而用户取消了拖曳怎么办。<br><br>至于你要求的先“复制”再“粘贴”,没研究过,不好意思!
 
非常感谢TrustMe的耐心帮助!<br><br>但是我的问题仍然没有解决。希望各位高手继续帮我一把。<br><br>刚才我仔细研究winrar软件,结果在winrar“文件”菜单下有一个“复制文件到剪贴板”的菜单(我以前怎么就没有看到呢,真是的!)。我压缩了一个100多M的文件,用winrar软件打开后,选择这个文件后,点“复制文件到剪贴板”菜单,文件信息到剪贴板里了,但没有解压缩。当我在资源管理器里点右键时,菜单很久才弹出来,结果发现在C:/Documents&nbsp;and&nbsp;Settings/MyUsername/Local&nbsp;Settings/Temp/Rar$DR02.532目录下找到了这个文件,点了“粘贴”按钮后,资源管理器将这个目录下的文件剪切到了我“粘贴”的目录里。如果我在winrar软件里再次点“复制文件到剪贴板”菜单,然后在资源管理器里点右键时,菜单很久才弹出来,又在另外的C:/Documents&nbsp;and&nbsp;Settings/MyUsername/Local&nbsp;Settings/Temp/Rar$DR20.239目录下找到了解压缩后的文件。我不粘贴,再在资源管理器里点右键时,菜单很快弹出来,“粘贴”菜单是灰色的。<br>各位已经看到了,winrar软件是检测资源管理器的弹出菜单的消息,一弹就解压缩,即使用户这次不是选择“粘贴”菜单,再弹就不能粘贴了。&nbsp;&nbsp;&nbsp;我哭!这样解决问题我也会。难道没有更好的方法了?
 
有必要吗?用现成的控件多好
 
QSmile总是提到用现成的控件,却不提供控件的功能与详细下载地址。
 
Look&nbsp;this<br><br>http://www.2ccc.com/article.asp?articleid=462
 
我看了QSmile提供的控件,好像没有将自己系统里的文件“复制文件到剪贴板”的功能,只有“从剪贴板粘贴文件进来”的功能。所以不能解决我的问题。
 
请参考&lt;&lt;DELPHI深度探索&gt;&gt;一书中的SHELL部分
 
我也正在研究这个问题,不过纯属研究,已经明确回答客户做不到了.呵呵.<br>你们说的这些我都试过,但还是没辙.&nbsp;&nbsp;最后一位仁兄说的shell,是否指的时shell钩子?&nbsp;我也试过,不行.&nbsp;windows的粘贴这个动作时截获不了的,不管你用shell钩子,还是鱼钩,铁构,都勾不住.<br><br>看我的帖子.http://www.delphibbs.com/delphibbs/dispq.asp?lid=3709818
 
墨剑也许说得对,从自己的软件里“复制”文件然后到资源管理器“粘贴”文件是没有办法的,windows没有提供相应API接口,windows只给自己的IE浏览器留了个后门,其他软件都没有办法了。Winrar软件是捕捉windows点右键时进行解压缩操作的,我们也只有这样做了。
 
不给接口,就自己&nbsp;Hook&nbsp;一个出来咯。
 
后退
顶部