/* 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") } !1:: sel := Explorer_GetSelected() Run gvim.exe "%sel%" return
2015年1月29日更新。
把操作系统从32位换到64位发现原来的不能用了,改了一下,目前64位可以使用。
/* 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") } ; open file with vim ^+0:: sel := Explorer_GetSelected() if (sel = "ERROR") { Run C:\Program Files\Vim\vim74\gvim.exe "C:\Users\Administrator\Desktop" } else { Run C:\Program Files\Vim\vim74\gvim.exe "%sel%" } return ; open file with emacs ^+-:: sel := Explorer_GetSelected() Run C:\Program Files\emacs-24.3\bin\runemacs.exe "%sel%" return ^+9:: sel := Explorer_GetSelected() if (sel = "ERROR") { Run c:\cygwin\bs.bat "C:\cygwin\home\Administrator" } else { Run c:\cygwin\bs.bat "%sel%" } return ^+8:: Run putty -i private.ppk [email protected] return