以下代码实现了一些针对 Windows 资源管理器的高级操作封装,尤其是文件路径的获取、选中文件以及打开文件夹等操作。


功能说明

1. 获取资源管理器的路径

  • 方法: Explorer_GetPath(hwnd="")
  • 功能:
    • 获取当前活动资源管理器窗口的路径。
    • 如果当前窗口是桌面,返回桌面路径。

2. 获取资源管理器的所有目录项

  • 方法: Explorer_GetAll(hwnd="")
  • 功能:
    • 返回当前资源管理器窗口中所有文件和文件夹的完整路径列表。

3. 获取资源管理器中选中的文件或文件夹

  • 方法: Explorer_GetSelected(hwnd="")
  • 功能:
    • 返回资源管理器窗口中当前选中的文件或文件夹的完整路径。

4. 获取资源管理器窗口对象

  • 方法: Explorer_GetWindow(hwnd="")
  • 功能:
    • 获取当前资源管理器窗口的 COM 对象。
    • 如果是桌面窗口,返回 "desktop"。

5. 打开目录并选中文件

  • 方法: File_OpenAndSelect(sFullPath)
  • 功能:
    • 打开资源管理器到指定目录并选中单个文件。

6. 打开目录并选中多个文件

  • 方法: Files_OpenAndSelect(path, selfilearr)
  • 功能:
    • 打开资源管理器到指定目录并选中多个文件。

 

代码示例:

Plain text
复制到剪贴板
Open code in new window
EnlighterJS 3 Syntax Highlighter
;方法 Explorer_GetPath(hwnd="")--获取当前资源管理器路径
;方法 Explorer_GetAll(hwnd="")--获取资源管理器目录
;方法 Explorer_GetSelected(hwnd="")--获取资源管理器已选择文件目录
;方法 Explorer_GetWindow(hwnd="")获取资源管理器窗口名字
;方法 Explorer_Get(hwnd="",selection=false)获取资源管理器目录获取
;方法 File_OpenAndSelect(path, selfilearr) --打开资源管理器并选中文件
;方法 Files_OpenAndSelect(path, selfilearr) --打开资源管理器并选中一个或多个文件
;历史
;2021-01-21 修复夹带16进制的bug
;示例
myfile:=New fileplus
F1::
path := myfile.Explorer_GetPath() ; 获取当前资源管理器路径
all := myfile.Explorer_GetAll() ; 遍历当前资源管理器目录文件名
sel := myfile.Explorer_GetSelected() ; 获取资源管理器已选择文件目录名
; MsgBox % path
; MsgBox % all
MsgBox % sel
; myfile.File_OpenAndSelect("D:\Pstools\1111.png") ; 单文件选中写法
; myfile.Files_OpenAndSelect("D:\Pstools",["1111.png","Hash.exe"]) ; 多文件选中写法
Return
Class FilePlus {
;方法 Explorer_GetWindow(hwnd="")获取管理器窗口名字
;参数hwnd
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)获取管理器目录获取
;参数hwnd
;参数selection 布尔类型
Explorer_Get(hwnd="",selection=false) {
if !(window := this.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")
}
;方法 Explorer_GetPath(hwnd="")--获取当前管理器路径
;参数hwnd
;示例path:=Explorer_GetPath()
Explorer_GetPath(hwnd="") {
if !(window := this.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="")--获取管理器目录
;参数hwnd
Explorer_GetAll(hwnd="") {
return this.Explorer_Get(hwnd)
}
;方法 Explorer_GetSelected(hwnd="")--获取管理器已选择文件目录
;参数hwnd
Explorer_GetSelected(hwnd="") {
return this.Explorer_Get(hwnd,true)
}
;方法 File_OpenAndSelect(sFullPath) --打开目录并选中文件
;参数sFullPath 类型字符串
;示例File_OpenAndSelect("E:\Documents\Desktop\ts1.ahk")
File_OpenAndSelect(sFullPath) {
SplitPath sFullPath, , sPath
FolderPidl := DllCall("shell32\ILCreateFromPath", "Str", sPath)
DllCall("shell32\SHParseDisplayName", "str", sFullPath, "Ptr", 0, "Ptr*", ItemPidl := 0, "Uint", 0, "Uint*", 0)
DllCall("shell32\SHOpenFolderAndSelectItems", "Ptr", FolderPidl, "UInt", 1, "Ptr*", ItemPidl, "Int", 0)
this.CoTaskMemFree(FolderPidl)
this.CoTaskMemFree(ItemPidl)
}
Files_OpenAndSelect(path,selfilearr) {
FolderPidl := DllCall("shell32\ILCreateFromPath", "Str", path)
VarSetCapacity(plist,selfilearr.Length() * A_PtrSize)
pidls := []
Loop % selfilearr.Length()
{
ItemPidl := DllCall("shell32\ILCreateFromPath", "Str", InStr(selfilearr[A_Index], ":") ? selfilearr[A_Index] : path "\" selfilearr[A_Index])
if (ItemPidl)
pidls.Push(ItemPidl), NumPut(ItemPidl, plist, (A_Index-1 ) * A_PtrSize,"ptr")
}
DllCall("shell32\SHOpenFolderAndSelectItems", "Ptr", FolderPidl, "UInt", pidls.Length(), "Ptr",&plist, "Int", 0)
this.CoTaskMemFree(FolderPidl)
Loop % pidls.Length()
{
this.CoTaskMemFree(pidls[A_Index])
}
}
CoTaskMemFree(pv) {
Return DllCall("ole32\CoTaskMemFree", "Ptr", pv)
}
}
;方法 Explorer_GetPath(hwnd="")--获取当前资源管理器路径 ;方法 Explorer_GetAll(hwnd="")--获取资源管理器目录 ;方法 Explorer_GetSelected(hwnd="")--获取资源管理器已选择文件目录 ;方法 Explorer_GetWindow(hwnd="")获取资源管理器窗口名字 ;方法 Explorer_Get(hwnd="",selection=false)获取资源管理器目录获取 ;方法 File_OpenAndSelect(path, selfilearr) --打开资源管理器并选中文件 ;方法 Files_OpenAndSelect(path, selfilearr) --打开资源管理器并选中一个或多个文件 ;历史 ;2021-01-21 修复夹带16进制的bug ;示例 myfile:=New fileplus F1:: path := myfile.Explorer_GetPath() ; 获取当前资源管理器路径 all := myfile.Explorer_GetAll() ; 遍历当前资源管理器目录文件名 sel := myfile.Explorer_GetSelected() ; 获取资源管理器已选择文件目录名 ; MsgBox % path ; MsgBox % all MsgBox % sel ; myfile.File_OpenAndSelect("D:\Pstools\1111.png") ; 单文件选中写法 ; myfile.Files_OpenAndSelect("D:\Pstools",["1111.png","Hash.exe"]) ; 多文件选中写法 Return Class FilePlus { ;方法 Explorer_GetWindow(hwnd="")获取管理器窗口名字 ;参数hwnd 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)获取管理器目录获取 ;参数hwnd ;参数selection 布尔类型 Explorer_Get(hwnd="",selection=false) { if !(window := this.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") } ;方法 Explorer_GetPath(hwnd="")--获取当前管理器路径 ;参数hwnd ;示例path:=Explorer_GetPath() Explorer_GetPath(hwnd="") { if !(window := this.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="")--获取管理器目录 ;参数hwnd Explorer_GetAll(hwnd="") { return this.Explorer_Get(hwnd) } ;方法 Explorer_GetSelected(hwnd="")--获取管理器已选择文件目录 ;参数hwnd Explorer_GetSelected(hwnd="") { return this.Explorer_Get(hwnd,true) } ;方法 File_OpenAndSelect(sFullPath) --打开目录并选中文件 ;参数sFullPath 类型字符串 ;示例File_OpenAndSelect("E:\Documents\Desktop\ts1.ahk") File_OpenAndSelect(sFullPath) { SplitPath sFullPath, , sPath FolderPidl := DllCall("shell32\ILCreateFromPath", "Str", sPath) DllCall("shell32\SHParseDisplayName", "str", sFullPath, "Ptr", 0, "Ptr*", ItemPidl := 0, "Uint", 0, "Uint*", 0) DllCall("shell32\SHOpenFolderAndSelectItems", "Ptr", FolderPidl, "UInt", 1, "Ptr*", ItemPidl, "Int", 0) this.CoTaskMemFree(FolderPidl) this.CoTaskMemFree(ItemPidl) } Files_OpenAndSelect(path,selfilearr) { FolderPidl := DllCall("shell32\ILCreateFromPath", "Str", path) VarSetCapacity(plist,selfilearr.Length() * A_PtrSize) pidls := [] Loop % selfilearr.Length() { ItemPidl := DllCall("shell32\ILCreateFromPath", "Str", InStr(selfilearr[A_Index], ":") ? selfilearr[A_Index] : path "\" selfilearr[A_Index]) if (ItemPidl) pidls.Push(ItemPidl), NumPut(ItemPidl, plist, (A_Index-1 ) * A_PtrSize,"ptr") } DllCall("shell32\SHOpenFolderAndSelectItems", "Ptr", FolderPidl, "UInt", pidls.Length(), "Ptr",&plist, "Int", 0) this.CoTaskMemFree(FolderPidl) Loop % pidls.Length() { this.CoTaskMemFree(pidls[A_Index]) } } CoTaskMemFree(pv) { Return DllCall("ole32\CoTaskMemFree", "Ptr", pv) } }
;方法 Explorer_GetPath(hwnd="")--获取当前资源管理器路径
;方法 Explorer_GetAll(hwnd="")--获取资源管理器目录
;方法 Explorer_GetSelected(hwnd="")--获取资源管理器已选择文件目录
;方法 Explorer_GetWindow(hwnd="")获取资源管理器窗口名字
;方法 Explorer_Get(hwnd="",selection=false)获取资源管理器目录获取
;方法 File_OpenAndSelect(path, selfilearr) --打开资源管理器并选中文件
;方法 Files_OpenAndSelect(path, selfilearr) --打开资源管理器并选中一个或多个文件

;历史
;2021-01-21 修复夹带16进制的bug

;示例
myfile:=New fileplus
F1::
path := myfile.Explorer_GetPath() ; 获取当前资源管理器路径
all := myfile.Explorer_GetAll() ; 遍历当前资源管理器目录文件名
sel := myfile.Explorer_GetSelected() ; 获取资源管理器已选择文件目录名
; MsgBox % path
; MsgBox % all
MsgBox % sel
; myfile.File_OpenAndSelect("D:\Pstools\1111.png") ; 单文件选中写法
; myfile.Files_OpenAndSelect("D:\Pstools",["1111.png","Hash.exe"]) ; 多文件选中写法
Return

Class FilePlus {
  ;方法 Explorer_GetWindow(hwnd="")获取管理器窗口名字
  ;参数hwnd
  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)获取管理器目录获取
  ;参数hwnd 
  ;参数selection 布尔类型
  Explorer_Get(hwnd="",selection=false) {
    if !(window := this.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")
  }
  ;方法 Explorer_GetPath(hwnd="")--获取当前管理器路径
  ;参数hwnd 
  ;示例path:=Explorer_GetPath()
  
  Explorer_GetPath(hwnd="") {
    if !(window := this.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="")--获取管理器目录
  ;参数hwnd 
  Explorer_GetAll(hwnd="") {
    return this.Explorer_Get(hwnd)
  }
  ;方法 Explorer_GetSelected(hwnd="")--获取管理器已选择文件目录
  ;参数hwnd 
  Explorer_GetSelected(hwnd="") {
     return this.Explorer_Get(hwnd,true)
  }

  ;方法 File_OpenAndSelect(sFullPath) --打开目录并选中文件
  ;参数sFullPath 类型字符串
  ;示例File_OpenAndSelect("E:\Documents\Desktop\ts1.ahk")
  File_OpenAndSelect(sFullPath) {
    SplitPath sFullPath, , sPath
    FolderPidl := DllCall("shell32\ILCreateFromPath", "Str", sPath)
    DllCall("shell32\SHParseDisplayName", "str", sFullPath, "Ptr", 0, "Ptr*", ItemPidl := 0, "Uint", 0, "Uint*", 0)
    DllCall("shell32\SHOpenFolderAndSelectItems", "Ptr", FolderPidl, "UInt", 1, "Ptr*", ItemPidl, "Int", 0)
    this.CoTaskMemFree(FolderPidl)
    this.CoTaskMemFree(ItemPidl)
  }
  Files_OpenAndSelect(path,selfilearr) {
    FolderPidl := DllCall("shell32\ILCreateFromPath", "Str", path)
    VarSetCapacity(plist,selfilearr.Length() * A_PtrSize)
    pidls := []
    Loop % selfilearr.Length()
    {
      ItemPidl := DllCall("shell32\ILCreateFromPath", "Str", InStr(selfilearr[A_Index], ":") ? selfilearr[A_Index] : path "\" selfilearr[A_Index])
      if (ItemPidl)
        pidls.Push(ItemPidl), NumPut(ItemPidl, plist, (A_Index-1 ) * A_PtrSize,"ptr")
    }
    DllCall("shell32\SHOpenFolderAndSelectItems", "Ptr", FolderPidl, "UInt", pidls.Length(), "Ptr",&plist, "Int", 0)
    
    this.CoTaskMemFree(FolderPidl)
    Loop % pidls.Length()
    {
      this.CoTaskMemFree(pidls[A_Index])
    }
  }
  CoTaskMemFree(pv) {
    Return DllCall("ole32\CoTaskMemFree", "Ptr", pv)
  }
}

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。