[AHK]关于获取文档路径的总结

38 篇文章 0 订阅

七年前写过一篇汇总的 ,获取打开的文档的路径 - 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%
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值