如何取得当前选中的文件的路径,下面的方法取得的无论在什么目录下,都是....(200分)

  • 主题发起人 netwinds
  • 开始时间
N

netwinds

Unregistered / Unconfirmed
GUEST, unregistred user!
function str_GetFileList(lngWnd : Hwnd):String;<br>var<br> &nbsp;intNewWnd : Hwnd;<br> &nbsp;g_wnd : Hwnd;<br> &nbsp;intP : Integer;<br> &nbsp;intIndex : Integer;<br> &nbsp;objItem : LV_ITEM;<br> &nbsp;strBuf : Array[0..255] of Char;<br> &nbsp;strFileName : String;<br> &nbsp;intHwnd : Hwnd;<br>begin<br> &nbsp;g_wnd := lngWnd;<br> &nbsp;intNewWnd := 0;<br> &nbsp;strFileName := '';<br> &nbsp;while g_wnd &lt;&gt; 0 do begin<br> &nbsp; &nbsp;intNewWnd := g_wnd;<br> &nbsp; &nbsp;g_wnd := GetParent(g_wnd);<br> &nbsp;end;<br> &nbsp;g_wnd := FindWindowEx(intNewWnd, 0, 'SHELLDLL_DefView', nil);<br> &nbsp;if g_wnd = 0 then begin<br> &nbsp; &nbsp;Result := '';<br> &nbsp; &nbsp;exit;<br> &nbsp;end;<br> &nbsp;intHwnd := g_wnd;<br> &nbsp;g_wnd := FindWindowEx(g_wnd, 0, 'Internet Explorer_Server', nil);<br> &nbsp;if g_wnd = 0 then begin<br> &nbsp; &nbsp;g_wnd := FindWindowEx(intHwnd, 0, 'DUIViewWndClassName', nil);<br> &nbsp; &nbsp;g_wnd := FindWindowEx(g_wnd, 0, 'DirectUIHWND', nil);<br> &nbsp; &nbsp;g_wnd := FindWindowEx(g_wnd, 0, 'CtrlNotifySink', nil);<br> &nbsp; &nbsp;g_wnd := FindWindowEx(g_wnd, 0, 'SysListView32', nil);<br> &nbsp;end<br> &nbsp;else begin<br> &nbsp; &nbsp;g_wnd := FindWindowEx(g_wnd, 0, 'ATL Shell Embedding', nil);<br> &nbsp; &nbsp;g_wnd := FindWindowEx(g_wnd, 0, 'SysListView32', nil);<br> &nbsp;end;<br> &nbsp;if g_wnd = 0 then begin<br> &nbsp; &nbsp;Result := '';<br> &nbsp; &nbsp;exit;<br> &nbsp;end;<br><br> &nbsp;intP := -1;<br> &nbsp;for intIndex := 0 to ListView_GetSelectedCount(g_wnd) do begin<br> &nbsp; &nbsp;intP := ListView_GetNextItem(g_wnd,intP,LVNI_SELECTED);<br> &nbsp; &nbsp;if intP &lt;&gt; -1 then begin<br> &nbsp; &nbsp; &nbsp;objItem.mask := LVIF_PARAM;<br> &nbsp; &nbsp; &nbsp;objItem.iItem := intP;<br> &nbsp; &nbsp; &nbsp;objItem.iSubItem := 0;<br> &nbsp; &nbsp; &nbsp;ListView_GetItem(g_wnd,objItem);<br> &nbsp; &nbsp; &nbsp;SHGetPathFromIDList(PItemIDList(objItem.lParam),strBuf);<br> &nbsp; &nbsp; &nbsp;//多个文件之间用 | 隔开,每个文件用双外号引起来是为了避免 Program Files 之类中间有空格的情况<br> &nbsp; &nbsp; &nbsp;strFileName := strFileName + '&quot;' + StrPas(strBuf) + '&quot;|';<br> &nbsp; &nbsp;end;<br> &nbsp;end;<br> &nbsp;Result := strFileName;<br>end;<br><br>如何取得当前选中的文件的路径,上面的方法取得的无论在什么目录下,都是 C:/Documents and Settings/..../桌面/文件名 <br><br>比如我当前的窗体是在 E:/Other 下,然后选择一个 a.txt ,但这边显示出来的则是 C:/Documents and Settings/Administrator/桌面/a.txt <br><br>请教高手!!!!!!!!!!
 
试试GetFileInformationByHandle
 
没看你的那么复杂的代码!因为我不了解,你说的选中是什么意思?无论什么情况,得到一个文件的路径都是可以简单实现的。直接说出你的要求来!可能很多人都能帮你解决。
 
GetFileInformationByHandle
 
用 GetFileInformationByHandle &nbsp;这个不行啊,现在都不知道文件的路径,如何去得到文件的句柄呢??<br><br><br>高手在吗?急啊!!!!!!!!
 
主要是你的问题问得不清楚:<br>如何取得当前选中的文件的路径 这句话的理解是不是 我用鼠标放到文件上 然后获得文件的路径<br>如果没有特别要求 为什么不用opendialog1.Execute?
 
if opendialog1.Execute then<br> &nbsp; OpenDialog1.FileName就可以得到文件的路径了。
 
晕,呵,都理解错了。<br><br>大家应该都有见过 google 之类的工具栏扩展插件吧(Shell Extensions)。我就是实现这样一个功能,在任意窗体打开之时,都会在窗体上显示一个工具栏出来。然后我要通过点击这个工具栏里面的一个按钮,来得到当前这个窗体选择了哪些文件,具体的路径是什么。<br><br>我是要判断当前 Windows 系统中所打开的任意一个窗体,比如点“我的电脑”,进入“C”盘,再进入任意一下目录(比如 Windows),然后选择这个目录里面的任意一个或多个文件。<br><br>我所想要的就是要得到现在选择了哪几个文件,这几个文件的目录全路径是什么。<br><br>上面显示的函数能够实现知道选择了哪几个文件,但路径名不对了。这边传入的名柄就是这个工具栏扩展插件的句柄。
 
if opendialog1.Execute then<br>s1:=opendialog1.FileName;<br>if savedialog1.Execute then<br>d1:=savedialog1.FileName;
 
是不是<br>我由<br>c:/<br>之後按c:/中的windows就可以得出<br>c:/windows<br>再按window內的一些文檔(如;system)<br>就可以得出c:/windows/system<br>是不是這樣?
 
我觉得你还是另外连路径也一起监控(比如地址栏),这样找着也方便
 
就比如我选择我的电脑里面的C盘里的WINDOWS目录里的A.txt ,选择之后,我能够知道这个 a.txt 的文件是 C:/Windows/A.txt ,就是这个目的。<br><br>没有什么 OpenDialog 或 SaveDialog 等的,请详细的看一下一楼的问题。<br><br>高手呢???????????????<br>快来啊!!!!!!!!!
 
不是吧,没人。。。。。。
 
就是得到选择的一个或者多个文件的绝对路径?
 
用ExtractFilePath吧
 
ExtractFileDir也可以的
 
to xinjinren<br> &nbsp; 是的。<br><br><br>to macrochan,dongy_143<br> &nbsp; 晕倒,有没有看看问题啊。。。。。。<br><br> &nbsp; 我如果能够知道这个文件,当然可以知道它的路径了,现在问题是不知道这个文件啊。
 
to netwinds:<br> &nbsp; 如果你能确保你的插件与Explorer的进程为同一个,那么你取得的肯定是正确的;<br> &nbsp; 如果你的插件与explorer不在同一进程,只能用hook去勾取消息而取得文件名了。
 
没全看懂你的代码,不过感觉是PItemIDList(objItem.lParam)的问题,你没得到正确的ItemIDList吧,建议再仔细看看这里的正确实现。
 
同一进程是没有问题的,因为每打开一个新的窗体,就会有一个新的插件出来,而我从不同窗体中取文件,名称都可取到(不同文件名),但路径都是指向了桌面(Desktop)的,所以也怀疑是 PItemIDList(objItem.lParam) 这边的问题,但具体如何解决还是没想到。<br><br>请教高手!!!!!!
 
顶部