MisterZakary
1/8/2018 - 6:12 PM

AHK:获取所选文件路径

AHK:获取所选文件路径

函数说明

Explorer_GetSelected(hwnd="") - 资源管理器所选择文件的路径
Explorer_GetAll(hwnd="") - 资源管理器中所有的文件路径
Explorer_GetPath(hwnd="") - 资源管理器打开的目录

例子:

F1::
        path := Explorer_GetPath()
        all := Explorer_GetAll()
        sel := Explorer_GetSelected()
        MsgBox % path
        MsgBox % all
        MsgBox % sel
return

库文件

/*
    Library for getting info from a specific explorer window (if window handle not specified, the currently active
    window will be used).  Requires AHK_L or similar.  Works with the desktop.  Does not currently work with save
    dialogs and such.
    
    
    Explorer_GetSelected(hwnd="")   - paths of target window's selected items
    Explorer_GetAll(hwnd="")        - paths of all items in the target window's folder
    Explorer_GetPath(hwnd="")       - path of target window's folder
    
    example:
        F1::
            path := Explorer_GetPath()
            all := Explorer_GetAll()
            sel := Explorer_GetSelected()
            MsgBox % path
            MsgBox % all
            MsgBox % sel
        return
    
    Joshua A. Kinnison
    2011-04-27, 16:12
*/
Explorer_GetPath(hwnd="")
{
    if !(window := Explorer_GetWindow(hwnd))
        return ErrorLevel := "ERROR"
    if (window="desktop")
        return A_Desktop
    path := window.LocationURL
    path := RegExReplace(path, "ftp://.*@","ftp://";)
    StringReplace, path, path, file:///
    StringReplace, path, path, /, \, All
    
    ; thanks to polyethene
    Loop
        If RegExMatch(path, "i)(?<=%)[\da-f]{1,2}", hex)
            StringReplace, path, path, `%%hex%, % Chr("0x" . hex), All
        Else Break
    return path
}
Explorer_GetAll(hwnd="")
{
    return Explorer_Get(hwnd)
}
Explorer_GetSelected(hwnd="")
{
    return Explorer_Get(hwnd,true)
}
Explorer_GetWindow(hwnd="")
{
    ; thanks to jethrow for some pointers here
    WinGet, process, processName, % "ahk_id" hwnd := hwnd? hwnd:WinExist("A")
    WinGetClass class, ahk_id %hwnd%
    
    if (process!="explorer.exe")
        return
    if (class ~= "(Cabinet|Explore)WClass")
    {
        for window in ComObjCreate("Shell.Application").Windows
            if (window.hwnd==hwnd)
                return window
    }
    else if (class ~= "Progman|WorkerW")
        return "desktop" ; desktop found
}
Explorer_Get(hwnd="",selection=false)
{
    if !(window := Explorer_GetWindow(hwnd))
        return ErrorLevel := "ERROR"
    if (window="desktop")
    {
        ControlGet, hwWindow, HWND,, SysListView321, ahk_class Progman
        if !hwWindow ; #D mode
            ControlGet, hwWindow, HWND,, SysListView321, A
        ControlGet, files, List, % ( selection ? "Selected":"") "Col1",,ahk_id %hwWindow%
        base := SubStr(A_Desktop,0,1)=="\" ? SubStr(A_Desktop,1,-1) : A_Desktop
        Loop, Parse, files, `n, `r
        {
            path := base "\" A_LoopField
            IfExist %path% ; ignore special icons like Computer (at least for now)
                ret .= path "`n"
        }
    }
    else
    {
        if selection
            collection := window.document.SelectedItems
        else
            collection := window.document.Folder.Items
        for item in collection
            ret .= item.path "`n"
    }
    return Trim(ret,"`n")
}

源代码示例

#ifWinActive,ahk_class CabinetWClass
^+c::
    ; clipboard :=GetFolder(GetPath())
    clipboard :=GetPath()
return
!c::
    clipboard :=GetFilename(GetPath())
return
#IfWinActive
GetFolder(txt)
{
    SplitPath, txt,, o
    return o
}
GetFilename(txt)
{
    SplitPath, txt, o
    return o
}
;在当前资源管理器窗口中,获取选中文件路径
GetPath(hwnd="")
    {
         ComObjError(false)
        WinGet, process, processName, % "ahk_id" hwnd := hwnd? hwnd:WinExist("A")
        WinGetClass class, ahk_id %hwnd%
        if (process != "explorer.exe")
            return
        if (class ~= "Progman|WorkerW") {
                ControlGet, files, List, Selected Col1, SysListView321, ahk_class %class%
                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)
                        sel := window.Document.SelectedItems
                    ;~ MsgBox % window.LocationURL
                }
                for item in sel
                    ToReturn .= item.path "`n"
            }
        return Trim(ToReturn,"`n")
    }

;***************************************
;5ぁ资源管理器增强
;***************************************
#If   WinActive("ahk_class CabinetWClass") or WinActive("ahk_class Progman|WorkerW")
^+c::
    ; clipboard :=GetFolder(GetPath())
    clipboard :=GetPath()
return
!c::
    clipboard :=GetFilename(GetPath())
return
^e::
file_path := GetPath()
command = "%path_sublime%" "%file_path%"
Run,%command%
Return
#If
GetFolder(txt)
{
    SplitPath, txt,, o
    return o
}
GetFilename(txt)
{
    SplitPath, txt, o
    return o
}
;在当前资源管理器窗口中,获取选中文件路径
GetPath(hwnd="")
    {
         ComObjError(false)
        WinGet, process, processName, % "ahk_id" hwnd := hwnd? hwnd:WinExist("A")
        WinGetClass class, ahk_id %hwnd%
        if (process != "explorer.exe")
            return
        if (class ~= "Progman|WorkerW") {
                ControlGet, files, List, Selected Col1, SysListView321, ahk_class %class%
                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)
                        sel := window.Document.SelectedItems
                        ; MsgBox % window.LocationURL
                }
                for item in sel
                    ToReturn .= item.path "`n"
            }
        return Trim(ToReturn,"`n")
    }