[教程]获取文件路径的函数

获取资源管理器文件路径、文件夹路径的代码,源自于Quant老大提供的原始代码,经本人修改并增强,是本人非常满意的函数。 使用不同的参数,可设定返回路径还是文件。

功能:获取资源管理器文件路径、文件夹路径的代码,源自于Quant老大提供的原始代码,经本人修改并增强后,为本人非常满意的函数。可以实现获取桌面的路径,当没有选择文件时,可以设定是否返回所在目录还是空。

!1::MsgBox % ExplorerInfo()
!2::MsgBox % ExplorerInfo(0)
!3::MsgBox % ExplorerInfo(1)
!4::MsgBox % ExplorerInfo(2)
ExplorerInfo(mode="",hwnd="") { ;Method="当前目录"的时候只返回当前目录;
;mode默认空值时,不论是否选中文件/文件夹皆返回当前路径(目录名);
;mode=0时,若选择了文件/文件夹则返回选中的目录名,不无选中时返回空;
;mode=1时,若选择了文件/文件夹则返回完成路径+文件名,无选中时返回目录名;
;mode=2时,若选择了文件/文件夹则返回完成路径+文件名,无选中时返回空值;

;@感谢Quant的原始代码
Toreturn=
filenum1=0
filenum2=0
WinGet, Process, ProcessName, % "ahk_id " (hwnd := hwnd? hwnd:WinExist("A")) ;这个地方判断是否给定了hwnd值,如果给定的为空,则获取当前窗口的句柄;否则就使用给定的句柄。
;得出给定句柄对应的进程名称;
WinGetClass class, ahk_id %hwnd% ;根据句柄来获取对应hwnd的窗口的类名;
ComObjError(0) ;不显示对象显示的错误。
if (Process = "explorer.exe") ;如果进程为explorer则进行判断到底时处于桌面(Progman|WorkerW)还是资源管理器((Cabinet|Explore)WClass);
if (class ~= "Progman|WorkerW")
{
ControlGet, files, List, Selected Col1, SysListView321, ahk_class %class% ;获取选中的文件的列表[无法获取到扩展名]
if files=
Toreturn .= A_Desktop
else
{
filenum1++
Loop, Parse, files, `n, `r
Toreturn .= A_Desktop "\" A_LoopField "`n"
}
}
else if (class ~= "(Cabinet|Explore)WClass")
{
for window in ComObjCreate("Shell.Application").Windows ;遍历当前资源管理器中打开的窗口;
{
if (window.hwnd==hwnd) ;在多个窗口中取定位符合前面hwnd的哪个窗口;
{
pp:=window.Document.folder.self.path
sel := window.Document.SelectedItems
for item in sel
{
filenum2++
Toreturn .= item.path "`r`n"
}
if Toreturn=
Toreturn:=pp
}
}
}

fde:=Trim(Toreturn,"`r`n") ;完整的路径和文件名,包括扩展名;
if mode<> ;mode为012时
{
if (filenum1+filenum2=0)
{
if (mode=0)||(mode=2)
{
return
}
else ;mod=1时的情况;
return fde
}else
{
if (mode=1) or (mode=2)
if (filenum1<>0)
{
aa:=选定的文件()
return aa ;选定的文件()
}
else
return fde
}
}
if InStr(FileExist(fde), "D") ;这里判断目录
return,RegExReplace(Trim(Toreturn,"`r`n") . "\","\\\\","\") ;这里的. "\"是给选定的文件夹加上\
else if Toreturn<>
{
StringMid,Toreturn2, Toreturn,1,InStr(Toreturn,"\",,0)-1 ;如果不是目录则按最后一个反斜杠进行截取,取前面的目录;
return RegExReplace(Toreturn2 . "\","\\\\","\")
}
}

选定的文件(){
Clip:=ClipboardAll
Clipboard=
send ^c
ClipWait,0.5
cliptem:=Clipboard
if (StrSplit(Cliptem,"`r").MaxIndex()=1)
{
Clipboard:= % Clip
return RegExReplace(cliptem,"`r`n","")
}
else
{
Clipboard:= % Clip
return cliptem
}}

 

给TA捐赠
共{{data.count}}人
人已捐赠
其他案例

[办公]秒表.ahk

2016-11-22 19:07:20

其他教程

完美的一键多用函数——摩斯密码

2016-11-24 20:59:32

4 条回复 A文章作者 M管理员
  1. YanYan

    不错 不错,省心安心,流量更少。

  2. 呵o呵

    不错的入门脚本,但是作者加的内容实在不怎么样

    • hexuren

      那你可以把你的改进类型分享出来

  3. maxs

    太棒了。不用剪切板

个人中心
购物车
优惠劵
有新私信 私信列表
搜索