七年前写过一篇汇总的 ,获取打开的文档的路径 - liuyukuan的专栏 - CSDN博客,当时只是做程序框架上的探索,因为ahk当时并不支持switch case语法(AutoHotkey1.1.31.00原生支持Switch-Case);没有仔细探讨获取打开文档有啥用处,最近很欣慰看到ahker网友写的《Kawvin工作台》用到了该技术,遂再详细分享下获取文档路径的思路:
1、首先想从标题栏显示文档全路径
比如Notepad2如下设置
VSCode如下设置标题栏显示完整路径:让VSCODE标题栏显示文档全路径 - liuyukuan的专栏 - CSDN博客
SciTE设置标题栏显示全路径:
资源管理器也可以设置,显示选中文件的全路径:
[AHK]切换到文件管理器中正在浏览的路径 - liuyukuan的专栏 - CSDN博客
[FUNC]如何取得 windows资源浏览器 的当前路径 - liuyukuan的专栏 - CSDN博客
2、其次想用COM来获取文档全路径:
请移步 [AHK]获取word文档路径 - liuyukuan的专栏 - CSDN博客
[AHK]列出当前开着的目录以及开着的xls文档路径 - liuyukuan的专栏 - CSDN博客
PPT 等其他微软Office系列,以此类推。
[FUNC]AHK获取当前选中的文件路径 - liuyukuan的专栏 - CSDN博客
[AHK]在 Explorer 中模仿 TC 获取文件和文件夹路径的功能 - liuyukuan的专栏 - CSDN博客
[AHK]获取多个文件路径,构造命令行,发送给Beyond Compare等程序 - liuyukuan的专栏 - CSDN博客
3、用软件支持的命令来获取文档全路径:
[AHK]热键获取TC当前的路径 - liuyukuan的专栏 - CSDN博客
TC使用技巧——复制文件名及路径 - scorpiomiracle的专栏 - CSDN博客
4、利用复制文件的方式来获取文档路径
[AHK] 从Everything获取选择文件的路径 在文中201行代码处
第一个例子,“复制路径” - liuyukuan的专栏 - CSDN博客
[AHK]用快捷键得到当前选中文件的路径 - liuyukuan的专栏 - CSDN博客
[AHK]实现资源管理器里右击文件复制完整路径 - liuyukuan的专栏 - CSDN博客
5、困难的如何获取记事本文档路径:
方法1:利用wmi
q::
Command_line := ""
; https://autohotkey.com/docs/commands/ComObjGet.htm
WinGet pid, pid, ahk_exe notepad.exe
; WinGet pid, pid, A ; if notepad is active
wmi := ComObjGet("winmgmts:")
queryEnum := wmi.ExecQuery(""
. "Select * from Win32_Process where ProcessId=" . pid)
._NewEnum()
if queryEnum[process]
{
file_path := process.CommandLine
StringReplace, file_path, file_path, "%A_Space%,,
StringReplace, file_path, file_path, ",, All
StringReplace, file_path, file_path, C:\Windows\system32\notepad.exe,,
StringReplace, file_path, file_path, C:\Windows\notepad.exe,,
}
else
MsgBox Process not found!
wmi := queryEnum := process := ""
MsgBox, file path:`n"%file_path%"
return
但上述方法并不是万能的,比如在用户打开notepad.exe并转到“文件>打开”并以这种方式选择一个文件,则脚本将返回空白,或者如果用户通过打开text1.txt启动了notepad.exe,然后转到“文件>打开”并打开text2.txt,那么您的脚本仍将返回text1.txt的路径-它不会更新为text2.txt。
方法2:读取notepad的内存
抛砖引玉 参考 notepad get/set path (get/set text file path) - AutoHotkey Community
If you use Process Hacker(一款用于调试和排除软件故障的强大工具 - FreeBuf互联网安全新媒体平台), 'right-click, Properties', on an exe, and go to the Memory tab, you see its list of memory regions.
Relevant memory regions and addresses:
0x7ff770c52000, Image: Commit, 12 kB, RW, C:\Windows\System32\notepad.exe, 12 kB, 12 kB, , ,
0x7ff770c545c0
0xfbc000, Image: Commit, 12 kB, RW, C:\Windows\SysWOW64\notepad.exe, 12 kB, 12 kB, , ,
0xfbd220
0xfbe000
;读取当前Notepad中的文档路径,在WIN10(64位系统),AHK x64位好用,能否改为AHK U32的?
WinGet, hWnd, ID, ahk_class Notepad
WinGet, vPID, PID, ahk_id %hwnd%
MAX_PATH := 260
;PROCESS_QUERY_INFORMATION := 0x400 ;PROCESS_VM_READ := 0x10
hProc := DllCall("kernel32\OpenProcess", UInt,0x410, Int,0, UInt,vPID, Ptr)
vAddress := 0x7FF601122000
VarSetCapacity(vPath, MAX_PATH*2, 0)
;从文件->打开文档情形
pianyi:=0xFF0
DllCall("kernel32\ReadProcessMemory", Ptr,hProc, Ptr,vAddress+pianyi, Str,vPath, UPtr,MAX_PATH*2, UPtr,0)
if !vPath
{
;从运行notepad带命令行情形
pianyi:=0x25E0
DllCall("kernel32\ReadProcessMemory", Ptr,hProc, Ptr,vAddress+pianyi, Str,vPath, UPtr,MAX_PATH*2, UPtr,0)
}
DllCall("kernel32\CloseHandle", Ptr,hProc)
msgbox %vPath%