[AHK]在 Explorer 中模仿 TC 获取文件和文件夹路径的功能

55 篇文章 7 订阅
38 篇文章 0 订阅
 
 
 
推荐方案:win7测试好用,测试前提是选中某文件后再按热键。
#Persistent
#SingleInstance force
;作者:Quant
;时间:2017年1月6日15:44:27
;功能:在资源管理器中,按热键 win+1/2/3获取目录/文件名/全路径
#1::
	clipboard :=GetFolder(GetPath())
return 
#2::
	clipboard :=GetFilename(GetPath())
return 
#3::
	clipboard :=GetPath()
return


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")  
    }  


如果只是获取当前打开的文件夹窗口的路径,其实还有更好的办法,最简单的其实是 获取标题的方式
 

 
 
 
WinGetActiveTitle, Title
MsgBox, The active window is "%Title%".

PS. 长文件名可能被截断,但基本够用。

-----------------------------------------------------------------------
还可以获取窗口信息,并解析,也比较简单,且没有截断的坑。

#z::
MsgBox % getExplorer()
return

getExplorer()
{    
    Loop,9
	{
	    ControlGetText, folder, ToolbarWindow32%A_Index%, ahk_class CabinetWClass
	} until (InStr(folder,"地址"))
 
    folder:=StrReplace(folder,"地址: ","") 
 
if (folder="计算机" )
    folder:="c:\"
return folder
}

 
---------------------------------------------
 
以下方法为模拟发送ctrl+c方案,会因文件大而造成速度慢。
 
作者: 2005ok

http://bbs.deepin.org/thread-1785189-1-1.html

TC 的强大让我离不开它,不过我还是不能抛弃 Explorer ,于是就有了以下这个脚本。

功能如下:
Alt + 1:复制选中的文件或文件夹的路径(不包含文件名)
Alt + 2:复制选中的文件或文件夹的名字(仅文件或文件夹名)
Alt + 3:复制选中的文件或文件夹的完整路径(包含文件名)

PS:可以多选。
PS2:以下代码在论坛的漂亮显示效果,来自 okey3m为ahk脚本生成 Disuz! 代码高亮,Thanks。


以下为 Explorer.ahk 中的内容。
;-------------------------------------------------------------------------------

#NoEnv
;~ #ErrorStdOut
#SingleInstance Force
;~ SetBatchLines -1
;~ SetKeyDelay -1
;~ SetMouseDelay -1
;~ SetDefaultMouseSpeed 0
;~ SetWinDelay -1
;~ SetControlDelay -1
;~ SetWorkingDir %A_ScriptDir%

SendMode InputThenPlay
SetTitleMatchMode Regex ;可以使用正则表达式对标题进行匹配

;-------------------------------------------------------------------------------

;~ 在 Explorer 中模仿 TC 获取文件和文件夹路径的功能。

; 下面的窗口类依次为:桌面、Win+D后的桌面、我的电脑、资源管理器、另存为等

#IfWinActive, ahk_class (Progman|WorkerW|CabinetWClass|ExploreWClass|#32770)
;~ 复制选中的文件或文件夹的路径(不包含文件名)
!1::
    GetPath("Dir", 1500)
Return


;~ 复制选中的文件或文件夹的名字(仅文件或文件夹名)
!2::
    GetPath("Name", 1500)
Return


;~ 复制选中的文件或文件夹的完整路径(包含文件名)
!3::
    GetPath("FullPath", 1500)
Return

;-------------------------------------------------------------------------------

#Include Function.ahk

;-------------------------------------------------------------------------------
以上为 Explorer.ahk 中的内容。


以下为 Function.ahk 中的内容。

;-------------------------------------------------------------------------------

;~ 以下是使用到的函数

;-------------------------------------------------------------------------------

;~ 获取选中的文件或文件夹的路径,复制到剪贴板

GetPath(Type = "FullPath", ShowTooltipTime = 0)
    {
        Clipboard =
        Send, ^c    ;这里的 c 写成大写 C 的话就不正常了,奇怪啊。。。
        ClipWait, 1
        If !ErrorLevel
        {
            Loop, Parse, Clipboard, `r, `n  ;windows 复制的时候,剪贴板会保存“路径”,可以当成字符串处理
            {
                If (Type = "Dir")
                {
                    SplitPath, A_LoopField,, Temp
                    Temp = %Temp%/             ;加 / 表明这是一个文件夹,不是无扩展名文件
                }

                If (Type = "Name")
                {
                    SplitPath, A_LoopField, Temp
                    If IsFolder(A_LoopField)
                    {
                        Temp = %Temp%/
                    }
                }

                If (Type = "FullPath")
                {
                    Temp = %A_LoopField%
                    If IsFolder(A_LoopField)
                    {
                        Temp = %Temp%/
                    }
                }

                FilePath = %FilePath%%Temp%`n
            }
            StringTrimRight, FilePath, FilePath, 1  ;去除后面多添加的一个换行符

            If (ShowTooltipTime > 0)                  ;控制弹出提示消息的时间长短
            {
                ToolTip, %FilePath%
                SetTimer, RemoveToolTip, 1500        ;1.5秒后移除提示信息
            }

            Clipboard = %FilePath%
            Return 1
        }
        Else
        {
            Return 0
        }
    }

;-------------------------------------------------------------------------------

;~ 判断选中的是否文件夹

IsFolder(Path)
    {
        FileGetAttrib, Attrib, %Path%   ;把 Path 指向的文件或文件夹的属性赋值给 Attrib
        IfInString, Attrib, D            ;如果在 Attrib 里有 D ,就表示这个路径代表的是文件夹,否则就是文件
        {
            Return 1
        }
        Else
        {
            Return 0
        }
    }

;-------------------------------------------------------------------------------

;~ 顾名思义,移除提示信息。

RemoveToolTip:
    SetTimer, RemoveToolTip, Off
    ToolTip
Return

;-------------------------------------------------------------------------------
以上为 Function.ahk 中的内容。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值