实现目标需要使用到(引包|倒包) 2 个 python 模块,
import win32api
import win32con
引言(扉页):
也适用于查找安装在Windows中的应用程序的绝对路径,
譬如:微信(WeChat)
正文(言归正传):
上述这两个模块是用来操作 Windows 注册表滴。
妇孺皆知,童叟无欺:
应用程序在安装到 Windows 中的时候,一定会将自己的信息写入注册表,
所以,在注册表中就可以找到应用程序的绝对路径。
首先,介绍第一个模块 win32api
,
我们要使用到它的 3 个函数:
win32api.
RegOpenKeyEx
()win32api.
RegQueryValueEx
()win32api.
RegCloseKey
()
RegOpenKeyEx
方法是用来打开注册表,打开我们指定的那个注册表路径(需要我们手工写明),这里面会有很多个结果,
RegOpenKeyEx
方法,就像定位到文件夹,
这里需要注意分清楚 注册表路径 和 应用程序路径。注册表路径:
是仅在注册表里起作用的路径(并不是应用程序在计算机文件系统中的路径),比如,我们要找的 chrome 浏览器会将自己的信息写进
注册表
的某个地方,给计算机操作系统使用,这个地方就对应着一个注册表路径
,而这个注册表路径
里的某个变量(在注册表里叫 key )里就有我们想要找的应用程序的路径。应用程序路径:
是应用程序在
计算机文件系统
中的路径,即 chrome 浏览器(应用程序)的安装路径
,给我们用户使用。严格意义上讲,
RegOpenKeyEx
中open
的含义是 打开一个句柄(handle)
,这个句柄就能定位到我们手工指定的注册表路径
当然 chrome的安装路径就在里面存着。
RegOpenKeyEx
方法会返回一个 python 关于Windows 注册表的对象
<PyHKEY:xxx>
,
ps (postscript):
>xxx IS 3 digital number
RegQueryValueEx
方法是用来在众多结果里,挑出来我们想要的某一条数据,
就像在文件夹里取出我们想要的文件,
把上面通过RegOpenKeyEx
方法 拿到的对象
<PyHKEY:xxx>
传给
RegQueryValueEx
方法,会得到一个元组,就是我们想要的 chrome 安装路径了。
RegCloseKey
方法微软说了,不应将
RegOpenKeyEx
保持打开状态, 所以养成好习惯,用完就给它关上。
实际案例:
python 通过 外置(需要 import 进程序的)模块 os 中的 system 方法 可以让电脑自动打开 chrome 浏览器,并进入指定的页面,
但需要将 chrome 浏览器的安装路径作为参数传给 os.system
os.system('C:\\Users\\admin\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe http://www.bing.com')
就是通过 os.system 操作计算机自动 打开 chrome 浏览器并进入 Bing 网站。
但 chrome 浏览器的安装路径找起来就比较麻烦,因为用户很可能在安装 chrome 浏览器的时候没有使用默认安装,而是指定了其他的安装路径,
当然也可以通过右键 chrome 浏览器的快捷方式去找 ,但我们毕竟是要用自动化的方式更准确,而且用python 通过注册表 还可以批量 查询 多个不同应用程序的安装路径,
代码解析:
语法:
RegOpenKey(key, subKey , reserved , sam)
第一个参数
key:
有 6 个 可选值,
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HEKY_LOCAL_MACHINE
HKEY_USERS
HKEY_CURRENT_CONFIG
就是 6 个 大的分类,
HEKY_LOCAL_MACHINE
:
安装应用程序时,操作系统自带的或者选择了默认安装或者选择了为本计算机上所有用户安装,这样的应用程序到这个大主键里去找,
HKEY_CURRENT_USER
:
上面找不到的,到这里找
来看一下这 6 个 大主键长什么样子
所以,第一个参数 要写 key,
我选的 大主键 是 HKEY_CURRENT_USER
因为之前在 HEKY_LOCAL_MACHINE
大主键里没找到 chrome.exe,
所以就选到了 HKEY_CURRENT_USER
这个大主键。
第二个参数
subkey:
要打开的子项(也叫子键),也就是在 6 大主键下面的注册表路径
我们要找的是 chrome.exe,所以子键是:
SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe
第一个参数 key 和第二个参数 subkey,组合起来就是完整的 注册表路径,
如下图
第三个参数
reserved:
必须为0
硬性规定
第四个参数
sam:
对打开注册表的子项,要进行的操作,
包括
win32con.KEY_ALL_ACCESS
win32con.KEY_READ
win32con.KEY_WRITE
…
我们这次选用的 是win32con.KEY_READ
,读操作
完整代码如下:
第一步
key = win32con.HKEY_CURRENT_USER
subkey = SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe'
reserved = 0
sam = win32con.KEY_READ
Result=win32api.RegOpenKeyEx(`key`,`subkey`,`reserved`, `sam`)
打开的注册表并定位到的
Result
是个 注册表对象<PyHKEY:521>
第二步
将 注册表对象 <PyHKEY:521>
传递给 RegQueryValueEx
函数
得到 一个 tuple
如下:
('C:\\Users\\admin\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe', 1)
取元组 的第一个值,
filePath=win32api.RegQueryValueEx(Result,'')[0]
得到最终的结果,即 chrome 浏览器的安装路径。
C:\\Users\\admin\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe
送给
os.system
计算机自动 打开 chrome 浏览器并进入 Bing 网站
PS:
filePath=win32api.RegQueryValueEx(Result,''
)
这里,用''
的原因是
我要取的是 chrome.exe 的完整路径,而不是它的父级目录,
所以,应该送给 win32api.RegQueryValueEx
的参数是 默认
而 默认 就是用''
,即空字串来表示的,
如果,我要取的是 chrome.exe 父级目录,那送给 win32api.RegQueryValueEx
的参数,按图上所标 就应该是 2 号的
path ,即
win32api.RegQueryValueEx(Result,'path')
这时候得到的结果就是 chrome.exe 的父级目录了,即
`C:\\Users\\admin\\AppData\\Local\\Google\\Chrome\\Application\\`
我这里参考了 博主 capsclock 的文章,有兴趣可以去看看,写的很全面,
Python获取PC版微信安装路径
capsclock 于 2022-12-19 16:38:14 发布
————————————————
版权声明:本文为CSDN博主「capsclock」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/capsclock/article/details/128374249
February the 17th 2023 Friday