以下代码实现了一些针对 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)
  • 功能:
    • 打开资源管理器到指定目录并选中多个文件。

 

代码示例:

;方法 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)
  }
}

 

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