-
Notifications
You must be signed in to change notification settings - Fork 72
/
Copy pathclass_ExplorerInfo.ahk
90 lines (83 loc) · 2.74 KB
/
class_ExplorerInfo.ahk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/**
* retrieves 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.
*
*/
class ExplorerInfo {
__New(){
}
get(hwnd="",selection=false) {
if !(window := this.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")
}
getAll(hwnd="") {
return this.get(hwnd)
}
getPath(hwnd="") {
if !(window := this.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
}
getSelected(hwnd="") {
return this.get(hwnd,true)
}
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
}
}