另一种用代码启动应用程序的方式

写在前面

通过代码打开应用程序,常见的就是直接通过路径来打开,以python为例:

arduino 复制代码
import os

subprocess.Popen("可执行文件路径")

之前写了两篇关于伪协议的文章,当时仅仅是探究了一下浏览器是怎么唤醒应用的。既然浏览器可以通过伪协议去唤醒应用,那么系统肯定也可以,以下均以windows举例。

伪协议

再粗略介绍一下伪协议,以windows为例,有的应用程序安装之后,会注册一个伪协议在注册表中,里面包含了伪协议描述以及程序路径,当然伪协议不仅仅只有打开的能力,这个需要看程序自己的支持,最终都体现在注册表中。

这个程序的伪协议就是一种与它通信的方式,具体的可以参考这两篇文章:

终于搞懂了浏览器是怎么唤醒本地应用了

(Mac版)终于搞懂了浏览器是怎么唤醒本地应用了

利用伪协议打开应用

这里我们以打开vscode为例,在windows中有一个start命令专门用来使用程序协议,在cmd中输入

arduino 复制代码
start vscode://

很简单,就打开了vscode,这里必须得是协议的格式才行。

也可以打开网站

这样就会用默认浏览器去访问

获取系统中的伪协议

我们提到了,伪协议都是在注册表中的,打开注册表我们发现都是在HEKY_CLASSES_ROOT这个路径下

这个下面主要是一些后缀配置,应用程序配置等等很多信息,咱们需要关注的就是应用程序中的伪协议,这里我用python写了一个代码来获取

python 复制代码
import winreg

root_index = 0

root_key_list = []

# 获取子键的数量
root_key = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, "")
root_key_info = winreg.QueryInfoKey(root_key)
sub_key_num = root_key_info[0]
print(sub_key_num)

# 键信息过滤
def filter_key(key: str):
    # windows功能
    if key.startswith("ms") or key.startswith("microsoft") or key.startswith("outlook"):
        return False
    if "-" in key or "." in key or "+" in key:
        return False
    
    # 常用非应用协议
    common_protocol = {"http", "https", "ftp", "file", "LDAP", "telnet", "res", "torrent", "tn3270", "accessclient", "adbps", "auphd", "tel", "tbauth", "MMS", "mk", "mailto",
                       "kismain", "tfs", "ts3server", "vmrc", "insiderhub", "rtsp", "rtmp", "rtkuwp", "rlogin", "qygameclient", "dgprotect", "corplink", "link2ea"}
    if key in common_protocol:
        return False

    return True

# 值信息过滤
def filter_value(value: str):
    if "windows" in value or "Windows" in value or "outlook" in value or "OneDrive" in value or "Handler" in value:
        return False
    return True

while root_index < sub_key_num:
    try:
        sub_key = winreg.EnumKey(winreg.HKEY_CLASSES_ROOT, root_index)
        sub_key_handel = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, sub_key)
        sub_key_value = winreg.QueryValueEx(sub_key_handel, "")[0]
        sub_key_value_info = winreg.QueryValueEx(sub_key_handel, "URL Protocol")
        
        if filter_key(sub_key) and filter_value(sub_key_value):
            root_key_list.append({"key": sub_key, "value": sub_key_value}) 
        root_index += 1
    except Exception:
        root_index += 1
        continue

for i in root_key_list:
    print(f"协议名:{i['key']}\t\t描述:{i['value']}")

这里简单讲一下,通过对HKEY_CLASSES_ROOT进行遍历,将包含伪协议信息的键值对拿出来,同时过滤了一些常用的协议以及一些不想要的程序的伪协议信息

以下是运行示例

代码中执行

这一步就很简单了,就是把上面的start命令写到代码里就行了

lua 复制代码
import os

os.system("start vscode://")

收工!

相关推荐
代码山河1 分钟前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
在世修行10 分钟前
智学文枢:题目流水线
python·多线程·状态机·pyside
学长毕设16 分钟前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
梯度下降者1 小时前
零基础入门Python 爬虫
爬虫·python·数据分析·入门指南·webcrawler
“AI国潮设计-小江”2 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
努力的小雨2 小时前
给 AI 眼镜开发应用有多难?我从零做了一个陪练,还上架了
后端
benchmark_cc3 小时前
用 Python 拉 A 股全市场实时快照:Notebook 请求、结果校验与易错点
python·数据分析·pandas·量化交易·股票数据·quantdash
伞伞悦读3 小时前
【第70期】Adam二阶矩不是方差:偏差校正、动量与AdamW完整实验
python
excel4 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放4 小时前
Python基础语法练习题(73)
java·前端·python