小弟是…win10 64bit 是用默认文件管理器…但…就出问题…><
大佬找到问题了…也改好了…需要修改以下部份就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打包不加密的
dog 哥,请教下,OnTopReplica 脚本,对有些窗口画取的区域有偏移,要如何调整脚本。
比如 :Notepad4 的窗口,画取的区域和最终置顶的区域有比较大的偏移。
能不能弄成通用脚本,将要调用的程序(如spacescniffer、fastcopy等)以参数形式传给该脚本来运行?
你可以参照着自己写一下。
确实哦,基本上所有窗口都会偏移,我研究一下怎么改一下计算方法。
感谢 DOG 哥,希望调整后能分享大众,万分感谢。 ![]()
我就是不会传参那一步啊 ![]()
每个软件都不一样的,你得看你的目标软件的说明
↑ 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查看当前文件夹等功能。

