Loading... 话不多说,先上代码 # 代码部分 ```python import sys import os import winreg def add_to_startup(name,file_path=""): if file_path == "": file_path = os.path.realpath(sys.argv[0]) key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Run", winreg.KEY_SET_VALUE, winreg.KEY_ALL_ACCESS|winreg.KEY_WRITE|winreg.KEY_CREATE_SUB_KEY) winreg.SetValueEx(key, name, 0, winreg.REG_SZ, file_path) winreg.CloseKey(key) def remove_from_startup(name): key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Run", winreg.KEY_SET_VALUE, winreg.KEY_ALL_ACCESS|winreg.KEY_WRITE|winreg.KEY_CREATE_SUB_KEY) try: winreg.DeleteValue(key, name) except FileNotFoundError: print("f{name} not found in startup.") else: print("f{name} removed from startup.") winreg.CloseKey(key) ``` # 使用说明 基于sys、os、winreg模块实现的程序开机自启,其中`add_to_startup()`函数用于添加自启动项,`remove_from_startup()`函数用于删除启动项 ## 依赖模块 无需自行安装额外模块 自带模块:sys、os、winreg ## 参数说明 `name(str)`:添加到注册表中的键值,需要具有一定标识性、独特性,避免与其他键重复,推荐使用程序名称 `file_path(str)`(可选):需要添加到启动项的文件地址,不填写默认为当前脚本所在地址 ## 使用实例(For 可执行文件) ```python #注意!演示默认你已经引入了模块和函数 #添加当前文件至启动项 add_to_startup("MyApp") #添加其他文件至启动项 add_to_startup("AnotherApp","D:\path\another.exe") #删除第一次添加的启动项 remove_from_startup("MyApp") #删除第二次添加的启动项 remove_from_startup("AnotherApp") ``` ## 使用实例(For Python文件) ```python #注意!演示默认你已经引入了模块和函数 #添加当前py文件至启动项 add_to_startup("MyPythonFile",sys.executable+os.path.realpath(sys.argv[0])) #添加其他py文件至启动项 add_to_startup("AnotherPythonFile",sys.executable+"D:\path\another.py") #删除第一次添加的启动项 remove_from_startup("MyPythonFile") #删除第二次添加的启动项 remove_from_startup("AnotherPythonFile") ``` # 函数实现步骤 1. `add_to_startup(name, file_path="")` 函数: * 如果 `file_path` 为空,函数会使用 `os.path.realpath(sys.argv[0])` 获取当前运行脚本的绝对路径。 * 使用 `winreg.OpenKey()` 函数打开注册表键(key),指定路径为 Windows中存储启动项的位置"Software\Microsoft\Windows\CurrentVersion\Run"。 * 使用 `winreg.SetValueEx()` 函数在指定的注册表键中创建一个新值(value),名称为 `name`,数据类型为字符串(REG_SZ),数据内容为 `file_path`。 * 最后使用`winreg.CloseKey()`关闭注册表键。 2. `remove_from_startup(name)` 函数: * 使用 `winreg.OpenKey()` 函数打开注册表键(key),指定路径为 Windows中存储启动项的位置"Software\Microsoft\Windows\CurrentVersion\Run"。 * 使用 `try-except` 语句尝试使用 `winreg.DeleteValue()` 函数删除指定名称的值(value)。如果找不到该值,将抛出 `FileNotFoundError` 异常,并打印 "not found in startup."。否则,删除成功后打印 "{name} removed from startup."。 * 最后使用`winreg.CloseKey()`关闭注册表键。 # 关键函数winreg.OpenKey()详解 `winreg.OpenKey()`函数的参数如下: * `key` :需要打开的键(HKEY)对象,可以是以下任意一个预定义的常量:`HKEY_CLASSES_ROOT`、`HKEY_CURRENT_USER`、`HKEY_LOCAL_MACHINE`、`HKEY_USERS`、`HKEY_PERFORMANCE_DATA`、`HKEY_CURRENT_CONFIG`或`HKEY_DYN_DATA`。 * `sub_key` :一个字符串,是要打开的键的子键的名称。例如,要访问`HKEY_CURRENT_USER\Software\Microsoft`下的键,需要将`key`参数设置为`winreg.HKEY_CURRENT_USER`,`sub_key`参数设置为`"Software\\Microsoft"`。 * `res` :预设为`0`,表示要打开该键的哪些部分,可以是以下任意一个常量:`winreg.KEY_QUERY_VALUE`、`winreg.KEY_SET_VALUE`、`winreg.KEY_CREATE_SUB_KEY`、`winreg.KEY_ENUMERATE_SUB_KEYS`、`winreg.KEY_NOTIFY`和`winreg.KEY_READ`中的若干个。 * `sam` :预设为`winreg.KEY_READ`,表示打开键时使用的安全访问掩码,可以是以下任意一个常量:`winreg.KEY_ALL_ACCESS`、`winreg.KEY_CREATE_LINK`、`winreg.KEY_CREATE_SUB_KEY`、`winreg.KEY_ENUMERATE_SUB_KEYS`、`winreg.KEY_EXECUTE`、`winreg.KEY_NOTIFY`、`winreg.KEY_QUERY_VALUE`、`winreg.KEY_READ`、`winreg.KEY_SET_VALUE`或`winreg.KEY_WRITE`等,可以通过按位或(`|`)运算符组合使用。 其中,各参数中常量的意义如下: 1. `key` 参数常量: * `HKEY_CLASSES_ROOT`:表示HKEY_CLASSES_ROOT键,包含文件类型和关联。 * `HKEY_CURRENT_USER`:表示当前用户注册表键。 * `HKEY_LOCAL_MACHINE`:表示计算机的 HKEY_LOCAL_MACHINE 注册表键。 * `HKEY_USERS`:表示注册表中所有用户配置和偏好设置的集合,包括默认用户配置和系统全局配置。 * `HKEY_CURRENT_CONFIG`:表示计算机当前配置的副本,即在“硬件配置”部分中的当前设置。 2. `res` 参数常量: * `KEY_QUERY_VALUE`:查询指定键的值。 * `KEY_SET_VALUE`:设置指定键的值。 * `KEY_CREATE_SUB_KEY`:创建键的子项。 * `KEY_ENUMERATE_SUB_KEYS`:枚举指定键的子项。 * `KEY_NOTIFY`:查询当前键值,但针对在键值更改后发生的更改,仍要接收通知。 * `KEY_READ`:查询指定键和键中的值。 3. `sam` 参数常量: * `KEY_ALL_ACCESS`:允许读取和修改键值。 * `KEY_CREATE_LINK`:允许创建符号链接键名。 * `KEY_CREATE_SUB_KEY`:允许创建子项。 * `KEY_ENUMERATE_SUB_KEYS`:允许枚举子项。 * `KEY_EXECUTE`:允许查询键值。 * `KEY_NOTIFY`:允许打开键,以接收更改通知。 * `KEY_QUERY_VALUE`:允许查询键值。 * `KEY_READ`:允许阅读键及其子项/键值。 * `KEY_SET_VALUE`:允许写入键值。 * `KEY_WRITE`:允许写入键和键值。 # 粉丝专属福利 附赠一段已经写好的切换自启状态的代码,直接调用即可 ```python import sys import os import winreg def modify_startup(name: str, file_path: str = ""): """ 自动切换开机自启状态 Args: name: 应用程序在启动项中的名称。 file_path: 应用程序的路径,如果为空则默认为当前脚本的路径。 Returns: Added: 已开启开机自启 Removed: 已取消开机自启 Raises: 无异常抛出。 """ if file_path == "": file_path = os.path.realpath(sys.argv[0]) # 打开注册表键。 key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Run", 0, winreg.KEY_ALL_ACCESS) try: # 检查键是否已经存在。 existing_value, _ = winreg.QueryValueEx(key, name) if existing_value == file_path: # 键名和键值都相同,需要删除键值。 winreg.DeleteValue(key, name) winreg.CloseKey(key) return "Removed" else: # 键名相同但键值不同,需要更新键值。 winreg.SetValueEx(key, name, 0, winreg.REG_SZ, file_path) return "Added" except WindowsError: # 键不存在,需要创建新的键值。 winreg.SetValueEx(key, name, 0, winreg.REG_SZ, file_path) return "Added" ``` Last modification:May 12, 2023 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 3 如果觉得我的文章对你有用,请随意赞赏