Autohotkey个人即用脚本分享(持续更新ing)

小弟是…win10 64bit 是用默认文件管理器…但…就出问题…><

1 个赞

大佬找到问题了…也改好了…需要修改以下部份就ok了…

;---------------资源管理器-------------------------
For openedwindows in ComObject("shell.Application").windows
{
    try {
        This := openedwindows.Document.Folder.Self.Path
        ContextMenu.insert(,This, MenuHandler)
        ContextMenu.SetIcon(kk "&", "shell32.dll", 5)
        kk++
    } catch {
        ; 窗口不是文件夹视窗,所以我们跳过它
    }
}
openedwindows := ""	;清空变量

如何才能看到你的AHK源码呢?只看到了exe。

用code打开exe最后面就是源码。
ahk打包不加密的

1 个赞

dog 哥,请教下,OnTopReplica 脚本,对有些窗口画取的区域有偏移,要如何调整脚本。

比如 :Notepad4 的窗口,画取的区域和最终置顶的区域有比较大的偏移。

能不能弄成通用脚本,将要调用的程序(如spacescniffer、fastcopy等)以参数形式传给该脚本来运行?

1 个赞

你可以参照着自己写一下。

确实哦,基本上所有窗口都会偏移,我研究一下怎么改一下计算方法。

感谢 DOG 哥,希望调整后能分享大众,万分感谢。 :slightly_smiling_face:

我就是不会传参那一步啊 :joy:

每个软件都不一样的,你得看你的目标软件的说明


↑ Claunch不是有“参数”这一项嘛;要是这一项直接就可以传入焦点所在文件夹路径,那一切都简单了;可惜这只能填固定内容……
所以我的思路是,利用这个“参数”项,填写需要运行的程序,而对该程序的路径传入,则使用调用脚本获取的当前窗口路径:

activedir:=Explorer_GetPath(WinExist("A"))
Run %ComSpec% /c 【“参数”项中指定的程序】 %activedir%,,Hide

问题就在于怎么将“参数”项传给AHK脚本

fastcopy 参数起码得两个吧,从哪到哪
而且大部分软件都不是这样的参数格式,要加什么 -c -d 之类的。
你这样定死了之后,也只能适配非常少的软件。

总之,不存在通用方案。

假设你要给fastcopy传参,你得去看fastcopy的说明,要按什么格式传参,

一般的软件都没办法说你传一个“目标地址”就能自动识别出来的

它可能是 -c “C:/1/2” ,也可能是 -f “C:/1/2”,只能单独适配

我只需要知道,怎么传参给AHK就可以了。只要这个通其他的我自己会解决。

我用 Filemenu Tools 给FastCopy传参,就没什么问题,只传递一个参数的话FC会将其填入“来源”,“目标”空着而已。
——
关键不是这个,是怎么将Claunch的“参数”传给AHK脚本,达到AHK脚本运行时①【召唤“参数”所指向的程序路径】并②【将AHK脚本获取的其他信息传给程序】。②这个在dog兄的spacesniffer脚本中就有,缺的是如何实现①。

那有没有一种可能,你的表述误导了dog,而不是人家不愿意教你

因为每个程序对应的格式可能不同,假设你要增加一个功能:打开evelynal.exe并把地址传过去
然后evelynal.exe要求的格式是-c “地址”
但原代码里的是/c ,所以你还是要修改代码才能实现这个功能
那修改一个/c和多修改一个软件地址貌似没有区别


另外,与其花两天时间追问别人一个不确定的答案,或许可以尝试用其他的方式解决

这里有更详细的介绍: 基础-如何用 AHK 处理命令行参数

当然我对ahk不甚了解,这只是我随手搜索出的答案,有可能也是不可行的

嘛,是我误会了,我以为我的需求在截图加举例后已经够清楚了。
的确,AHK的帮助里面有,就是混杂在一个大文档里不好搜索:

#基本用法和语法 >> ##脚本(杂项)>> ###向脚本传递命令行参数
脚本支持命令行参数. 格式为:
AutoHotkey.exe [Switches] [Script Filename] [Script Parameters]
传入参数, ……传统方法: 命令行参数也存储在变量 %1%, %2% 等中……

你用的是ahk v1,还是v2

如果是v2

给ahk脚本传递参数用下面格式:
“C:\Program Files\AutoHotkey\v2\AutoHotkey64.exe” /restart C:\你的脚本路径.ahk 参数1 参数2

下面是AutoHotkey的程序,这个用来运行ahk脚本
“C:\Program Files\AutoHotkey\v2\AutoHotkey64.exe”

下面是参数,包括ahk脚本和脚本的参数:
【C:\你的脚本路径.ahk 参数1 参数2】

/restart 可以不要,这个是重新打开脚本的意思

在ahk文件里:
A_Args[1] 是参数1
A_Args[2] 是参数2

貌似上面的代码ahk v1也能用

改好了。

原代码
activedir:=Explorer_GetPath(WinExist("A"))
Run %ComSpec% /c ""C:\miniapp\SpaceSniffer.exe" scan " %activedir%,,Hide

;以下是库
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://")
    path := RegExReplace(path, "%20"," ") ;替换空格,否则显示%20
    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")
}

将该代码的前两行改成:

activedir:=Explorer_GetPath(WinExist("A"))
Run %1% %activedir%,,Hide

保存后添加到Claunch,然后在该图标属性中,按下图设置:

!!建议③的路径用英文双引号包起来
就能实现将当前资源管理器窗口的路径传给③的程序。
举例操作步骤就是,在开着 E:\下载 文件夹的资源管理器窗口中,召唤 Claunch ,点“WizTree”图标,“WizTree”程序就会打开并在其中加载 E:\下载 文件夹。
用同样的办法就可以实现调用Potplayer播放当前文件夹、Faststone查看当前文件夹等功能。

1 个赞