首页
友链
关于
统计
推荐
阅番名录
Search
1
PL2DForTC Live2D 插件
311 阅读
2
关于我总结的一些P106-100相关的避坑指南
171 阅读
3
html 实现动态视频背景
164 阅读
4
适用于typecho的joe主题统计页面的Uptime_status
79 阅读
5
typecho 插件 php读取文件 和 筛选指定文件类型
72 阅读
默认分类
前端
后端
typecho
登录
Search
jacksen168
累计撰写
13
篇文章
累计收到
7
条评论
首页
友链
关于
统计
阅番名录
文章分类
默认分类
前端
后端
typecho
已存活
146
天
23
时
13
分
16
秒
搜索到
13
篇与
的结果
2023-04-09
关于如何在程序中判断Windows系统自带的移动热点是否开启解决思路
关于如何在程序中判断Windows系统自带的移动热点是否开启解决思路前言最近在写python时,遇到了电脑开热点的问题,网上大多数都是通过创建虚拟网卡的方式开启热点。我也看了一下,但不适合我,于是我通过其他方式开启了Windows系统自带的移动热点。又被它长时间无人连接会关闭所困扰。于是上网查了一下如何通过代码判断Windows系统自带的移动热点是否开启,很可惜无论是C#还是python其他什么的语言都没有相关的内容,可能是我的问题前所未有,于是我打算自己研究。核心原理Windows系统自带的热点功能也其实是通过创建一个虚拟网卡来发射WIFI信号,移动热点关闭虚拟网卡也会关闭,那么就可以用ping的方式来ping它的网关这样就知道它是否在开启着热点了首先看一下它的网关地址:拿到它的网关IP:192.168.137.1然后打开热点ping它再看看关闭热点后,ping不ping的通看样子行的通,开了热点就ping的通,反之就ping不同。那么就没问题了,通过这种方式各语言都能通过ping的方式来判断Windows系统自带的移动热点是否开启了。
2023年04月09日
53 阅读
0 评论
0 点赞
2023-02-26
根据API更换Windows壁纸项目[python]
根据API更换Windows壁纸项目[python]前言起因是这样的,我们学校上课用的一体机一直以来都是鸿合一体机自带的鸿合LOGO壁纸,十分无趣。于是我写了这个程序用于远程间接性的控制电脑的壁纸,既没有人看到是我换的,也可也看到的自己喜欢的壁纸,岂不美哉。说干就干,于是我花费2个小时写了这个。技术不好,码烂勿喷。说明:测试平台:Windows10 22H2 and Windows11 22H2(其他平台没测试)程序类型:python版本:普通版/进阶版进阶版里内含了普通版,进阶版运行时会自动获取管理员权限,可能触发UAC弹窗警告。程序支持多张壁纸按列表循环播放,内置记忆功能可读取上次播放的最后一张壁纸,并继续。保存壁纸的目录为程序当前目录下的images(没有会自动创建)程序采用注册表存储配置信息web_url为API请求网址注意:程序是通过对比 [本地已保存的API] 和 [在线的API] 来判断程序是否需要更新本地壁纸更新壁纸时会清理掉已有的壁纸再进行下载程序可通过pyinstaller/auto-py-to-exe打包成可执行文件.exe再给exe程序搞个开机自启就可以了{lamp/}普通版(.py文件):## ////////////////////////////////////////////////////////导包区//////////////////////////////////////////////////////// import ctypes import json import os import requests import schedule import shutil import sys import time import win32con import win32gui import winreg ## ////////////////////////////////////////////////////////配置区//////////////////////////////////////////////////////// Version = '0.5' program_name = r'wallpaper' program_reg_path = r'SOFTWARE\\' + program_name CreateKey = winreg.CreateKey(winreg.HKEY_CURRENT_USER, program_reg_path) OpenKey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, program_reg_path) Program_path = os.path.dirname(os.path.realpath(sys.argv[0])) default_config = {'images_index': 0} web_url = 'https://www.jacksen168.top/api/data?name=' + program_name + '&version=' + Version print(web_url) ## ////////////////////////////////////////////////////////模块区//////////////////////////////////////////////////////// # 联网判断抉择模块 def isConnected(type, url): try: if type == 1: # url响应判断 requests.get(url, timeout=20) print('[\033[1;32;40m url响应正常 \033[0m]') # url 请求状态判断 status = requests.get(url).status_code if status == 200: print('[\033[1;32;40m 请求正常,状态码[%s] | url(%s) \033[0m]' % (status, url)) return True else: print('[\033[1;31;40m 请求异常,状态码[%s] | url(%s) \033[0m]' % (status, url)) return False else: # url响应判断 requests.get(url, timeout=20) print('[\033[1;32;40m url响应正常 \033[0m]') return True except: print('[\033[1;33;40m url响应异常 \033[0m]') return False # 数据获取模块 def get_json(type): if type == 0: # 优先选择在线数据,json if isConnected(1, web_url): # 有网络 return get_json(1) else: # 无网络 return get_json(2) elif type == 1: # 获取在线json try: url = requests.get(web_url) text = url.text if text == '': data = None else: data = json.loads(text) return data except: print('请求api发生未知错误') elif type == 2: # 获取离线json try: value, type = winreg.QueryValueEx(OpenKey, 'online_data') except: return None if value == '': data = None else: data = json.loads(value) return data # 判断文件/路径是否存在 或 创建 def if_path_exists(type, path): if type == 0: # 仅判断 if not os.path.exists(path): return False else: return True elif type == 1: # 判断并创建 if not os.path.exists(path): print('目录修复:', path, '[路径不存在]') # 在当前路径创建img/文件夹 os.makedirs(path) print('目录修复:', path, '[路径已创建]') return True else: return True else: return True # 文件下载模块 def downloadFile(filename, url): # 单文件下载--节省内存 # 屏蔽warning信息 requests.packages.urllib3.disable_warnings() path = Program_path + '\\images' file = path + '\\' + filename print('开始下载', '文件: ' + filename, '存储路径: ' + path, 'url: ' + url) if if_path_exists(1, path): # # 请求文件大小 # r1 = requests.get(url, stream=True, verify=False) # total_size = int(r1.headers['Content-Length']) # 读取本地文件大小 if os.path.exists(file): temp_size = os.path.getsize(file) # 本地已经下载的文件大小 else: temp_size = 0 try: r = requests.get(url, stream=True, verify=False) with open(file, 'wb') as f: for chunk in r.iter_content(chunk_size=1024 * 10): # 每次只写10240byte = 10MB if chunk: temp_size += len(chunk) f.write(chunk) f.flush() ###这是下载实现进度显示#### # done = int(50 * temp_size / total_size) # # sys.stdout.write('\r[%s%s] %d%%' % ('█' * done, ' ' * (50 - done), 100 * temp_size / total_size)) # sys.stdout.flush() print(' ', '-' * 10, ' ' + filename + ' [\033[1;32;40m 下载完成 \033[0m]') except: print('下载出错') print('\n') # 旧文件清理模块 def old_file_cleanup(): dir = Program_path + '/images' if if_path_exists(0, dir): # 判断路径有效性,删除程序安装目录 print('开始删除', dir) shutil.rmtree(dir) print(dir, '文件夹删除成功') else: print(dir, '文件夹删除失败', '路径无效') # 更换壁纸模块 def wallpaper(): global images_index global global_data global Program_path print(global_data['style']) def set_wallpaper(img_path): # 打开指定注册表路径 reg_key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, "Control Panel\\Desktop") # 最后的参数:2拉伸,0居中/平铺,6适应,10填充,22跨区 winreg.SetValueEx(reg_key, 'WallpaperStyle', 0, winreg.REG_SZ, str(global_data['style']['WallpaperStyle'])) # 最后的参数:1表示平铺,拉伸居中等都是0(对上方设置的补充) winreg.SetValueEx(reg_key, "TileWallpaper", 0, win32con.REG_SZ, str(global_data['style']['TileWallpaper'])) # 通过注册表来修改壁纸(更贴进手动设置,比下面那个优先级要高。可避免背景设置成纯色重启电脑后,出现无法更换壁纸的情况) winreg.SetValueEx(reg_key, "WallPaper", 0, win32con.REG_SZ, img_path.replace('/', '\\')) # 刷新桌面与设置壁纸 win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, img_path, win32con.SPIF_SENDWININICHANGE) # 注意路径书写问题 # img_path = "E:/Pictures/通用/win10 Snow.jpg" if global_data['data'] is not None: img_path = Program_path + "\\images\\" + global_data['data'][images_index]['name'] # 切换时要检查一下图片是否存在 if if_path_exists(0, img_path): set_wallpaper(img_path) else: print('壁纸更换失败:图片不存在', 'path:' + img_path) # images_index更新 if images_index + 1 < len(global_data['data']): images_index = images_index + 1 set_config('images_index', images_index) else: images_index = 0 set_config('images_index', images_index) print('壁纸更换程序运行完毕,将index成功改为: ' + str(images_index) + '\n') else: print('壁纸更换失败:数据为空,等待同步') # 数据同步模块 def data_synchronization(): global global_data global images_index # 同步数据及文件 if get_json(0) == get_json(2): # 数据无误 print('数据无误') else: # 数据存在差异:开始同步 # 壁纸index重置 images_index = 0 # 同步数据 print('数据存在差异:开始同步新数据') winreg.SetValueEx(CreateKey, 'online_data', 0, winreg.REG_SZ, json.dumps(global_data)) # winreg.CloseKey(CreateKey) print('本地数据同步完成') # 同步文件 print('数据存在差异:开始同步新文件') old_file_cleanup() print('开始同步新文件') for index in range(len(global_data['data'])): # 根据data里的元素数量逐个下载文件 file_data = global_data['data'][index] if isConnected(2, file_data['url']): # 判断文件下载url是否有效 downloadFile(file_data['name'], file_data['url']) print('全部文件下载完毕') # 首次运行配置数据修复模块 def repair_config(): print('config配置信息开始修复') try: # 写入reg winreg.SetValueEx(CreateKey, 'config', 0, winreg.REG_SZ, json.dumps(default_config)) print('config配置信息修复完毕') except: print("Error:[配置数据修复模块]发生未知错误") # 配置数据获取模块 def get_config(config_item_name): try: key = winreg.OpenKey(win32con.HKEY_CURRENT_USER, program_reg_path, 0, win32con.KEY_ALL_ACCESS) config_data, type = winreg.QueryValueEx(key, "config") data = json.loads(config_data) return data[config_item_name] except FileNotFoundError: print('Warning:config为空') repair_config() return 0 except: print("Error:reg无法读取config") # 配置数据修改模块 def set_config(config_item_name, value): try: # 先读取config key = winreg.OpenKey(win32con.HKEY_CURRENT_USER, program_reg_path, 0, win32con.KEY_ALL_ACCESS) config_data, type = winreg.QueryValueEx(key, "config") data = json.loads(config_data) # 再修改config data[config_item_name] = value # 写入reg winreg.SetValueEx(CreateKey, 'config', 0, winreg.REG_SZ, json.dumps(data)) except FileNotFoundError: print('Error:set_config config读取失败') except: print("Error:[配置数据修改模块]发生未知错误") ## ////////////////////////////////////////////////////////run区//////////////////////////////////////////////////////// def start(): global global_data if global_data is None: # 判断运行条件是否满足 # print('没有获取到数据,不满足运行条件,程序退出') print('初次运行,先等待5分钟(直到与服务器通信恢复)') time.sleep(5) start() else: # 有数据,运行条件满足(程序非第一次运行没有网络) print('网络已连接,开始同步数据') if global_data['status'] == 1: # 启动 print('程序启用状态') data_synchronization() else: print('程序关闭状态') exit() print('所有程序运行完毕,结束进程') def run(): global global_data global images_index global_data = get_json(0) print(global_data) data = global_data images_index = get_config('images_index') start() # 启动时第一次同步数据 # 启动线程 schedule.every(data['update_time']).seconds.do(data_synchronization) schedule.every(data['refresh_time']).seconds.do(wallpaper) print('当前更新速度' + str(data['update_time'])) print('当前刷新速度' + str(data['refresh_time'])) print('上次运行images_index:' + str(images_index)) print('程序初始化完毕', '/' * 300) # 线程计时器 while True: schedule.run_pending() time.sleep(1) ## ////////////////////////////////////////////////////////启动区//////////////////////////////////////////////////////// run() # 启动程序 API格式(json){ "time": 1664757166, "status": 1, "update_time": 3600, "refresh_time": 5, "style": { "WallpaperStyle": 10, "TileWallpaper": 0 }, "data": [ { "name": "jacksen168_Wallpaper_021_LOGO.jpg", "url": "https://jacksen168.top/img/last.jpg" } ] } 含义名称含义值time时间戳(可用于程序检查是否需要更新)默认时间戳status程序状态(程序的状态开关)0(关闭)/1(开启)update_time检查更新时间(毫秒)时间(毫秒)refresh_time壁纸刷新时间(毫秒)时间(毫秒)style->WallpaperStyle更换壁纸样式(对应win10设置中的背景契合度)2拉伸,0居中/平铺,6适应,10填充,22跨区style->TileWallpaper更换壁纸样式(对应win10设置中的背景契合度)1表示平铺,拉伸居中等都是0(对上方设置的补充)data->[]->name保存到本地图片的名称图片.jpg/图片.pngdata->[]->url需要下载的图片网址(url)例子: http://baidu.com/LOGO.jpgdata是个数组,可选择多张壁纸循环播放,例子:"data": [ { "name": "jacksen168_Wallpaper_021_1.jpg", "url": "https://jacksen168.top/img/last1.jpg" },{ "name": "jacksen168_Wallpaper_021_2.jpg", "url": "https://jacksen168.top/img/last2.jpg" },{ "name": "jacksen168_Wallpaper_021_3.jpg", "url": "https://jacksen168.top/img/last3.jpg" } ]{lamp/}进阶版(程序自动获取管理员权限,可能会触发UAC弹窗警告):说明:进阶版新增一种更换壁纸方式,会使win10设置里的背景无法修改(锁定)## ////////////////////////////////////////////////////////导包区//////////////////////////////////////////////////////// import ctypes import json import os import shutil import sys import time import winreg import requests import schedule import win32con import win32gui ## ////////////////////////////////////////////////////////配置区//////////////////////////////////////////////////////// Version = '0.5' program_name = r'wallpaper' program_reg_path = r'SOFTWARE\\' + program_name CreateKey = winreg.CreateKey(winreg.HKEY_CURRENT_USER, program_reg_path) OpenKey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, program_reg_path) Program_path = os.path.dirname(os.path.realpath(sys.argv[0])) default_config = {'images_index': 0} web_url = 'https://www.jacksen168.top/api/data?name=' + program_name + '&version=' + Version print(web_url) ## ////////////////////////////////////////////////////////模块区//////////////////////////////////////////////////////// # 联网判断抉择模块 def isConnected(type, url): try: if type == 1: # url响应判断 requests.get(url, timeout=20) print('[\033[1;32;40m url响应正常 \033[0m]') # url 请求状态判断 status = requests.get(url).status_code if status == 200: print('[\033[1;32;40m 请求正常,状态码[%s] | url(%s) \033[0m]' % (status, url)) return True else: print('[\033[1;31;40m 请求异常,状态码[%s] | url(%s) \033[0m]' % (status, url)) return False else: # url响应判断 requests.get(url, timeout=20) print('[\033[1;32;40m url响应正常 \033[0m]') return True except: print('[\033[1;33;40m url响应异常 \033[0m]') return False # 数据获取模块 def get_json(type): if type == 0: # 优先选择在线数据,json if isConnected(1, web_url): # 有网络 return get_json(1) else: # 无网络 return get_json(2) elif type == 1: # 获取在线json try: url = requests.get(web_url) text = url.text if text == '': data = None else: data = json.loads(text) return data except: print('请求api发生未知错误') elif type == 2: # 获取离线json try: value, type = winreg.QueryValueEx(OpenKey, 'online_data') except: return None if value == '': data = None else: data = json.loads(value) return data # 判断文件/路径是否存在 或 创建 def if_path_exists(type, path): if type == 0: # 仅判断 if not os.path.exists(path): return False else: return True elif type == 1: # 判断并创建 if not os.path.exists(path): print('目录修复:', path, '[路径不存在]') # 在当前路径创建img/文件夹 os.makedirs(path) print('目录修复:', path, '[路径已创建]') return True else: return True else: return True # 文件下载模块 def downloadFile(filename, url): # 单文件下载--节省内存 # 屏蔽warning信息 requests.packages.urllib3.disable_warnings() path = Program_path + '\\images' file = path + '\\' + filename print('开始下载', '文件: ' + filename, '存储路径: ' + path, 'url: ' + url) if if_path_exists(1, path): # # 请求文件大小 # r1 = requests.get(url, stream=True, verify=False) # total_size = int(r1.headers['Content-Length']) # 读取本地文件大小 if os.path.exists(file): temp_size = os.path.getsize(file) # 本地已经下载的文件大小 else: temp_size = 0 try: r = requests.get(url, stream=True, verify=False) with open(file, 'wb') as f: for chunk in r.iter_content(chunk_size=1024 * 10): # 每次只写10240byte = 10MB if chunk: temp_size += len(chunk) f.write(chunk) f.flush() ###这是下载实现进度显示#### # done = int(50 * temp_size / total_size) # # sys.stdout.write('\r[%s%s] %d%%' % ('█' * done, ' ' * (50 - done), 100 * temp_size / total_size)) # sys.stdout.flush() print(' ', '-' * 10, ' ' + filename + ' [\033[1;32;40m 下载完成 \033[0m]') except: print('下载出错') print('\n') # 旧文件清理模块 def old_file_cleanup(): dir = Program_path + '/images' if if_path_exists(0, dir): # 判断路径有效性,删除程序安装目录 print('开始删除', dir) shutil.rmtree(dir) print(dir, '文件夹删除成功') else: print(dir, '文件夹删除失败', '路径无效') # 更换壁纸模块 def wallpaper(): global images_index global global_data global Program_path print(global_data['style']) def set_wallpaper(type, img_path): if type == 1: # 默认模式:模拟控制面板 print('模拟控制面板模式') # 清理type == 2的残留 try: reg_key_System = winreg.CreateKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System") winreg.DeleteValue(reg_key_System, 'WallpaperStyle') winreg.DeleteValue(reg_key_System, 'WallPaper') except: if False: print() # 打开指定注册表路径 reg_key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, "Control Panel\\Desktop") # 最后的参数:2拉伸,0居中/平铺,6适应,10填充,22跨区 winreg.SetValueEx(reg_key, 'WallpaperStyle', 0, winreg.REG_SZ, str(global_data['style']['WallpaperStyle'])) # 最后的参数:1表示平铺,拉伸居中等都是0(对上方设置的补充) winreg.SetValueEx(reg_key, "TileWallpaper", 0, win32con.REG_SZ, str(global_data['style']['TileWallpaper'])) # 通过注册表来修改壁纸(更贴进手动设置,比下面那个优先级要高。可避免背景设置成纯色重启电脑后,出现无法更换壁纸的情况) winreg.SetValueEx(reg_key, "WallPaper", 0, win32con.REG_SZ, img_path.replace('/', '\\')) # 刷新桌面与设置壁纸 win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, img_path, win32con.SPIF_SENDWININICHANGE) elif type == 2: print('管理员权限模式') # 打开指定注册表路径 reg_key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System") # 最后的参数:0=居中 ,1=平铺 ,2=拉伸 winreg.SetValueEx(reg_key, "WallpaperStyle", 0, win32con.REG_SZ, str(global_data['style']['WallpaperStyle'])) # 设置壁纸 winreg.SetValueEx(reg_key, "WallPaper", 0, win32con.REG_SZ, img_path.replace('/', '\\')) # 刷新桌面与设置壁纸 win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, img_path, win32con.SPIF_SENDWININICHANGE) print('[' + str(images_index) + "]成功切换壁纸:" + img_path) # 注意路径书写问题 # img_path = "E:/Pictures/通用/win10 Snow.jpg" if global_data['data'] is not None: img_path = Program_path + "\\images\\" + global_data['data'][images_index]['name'] # 切换时要检查一下图片是否存在 if if_path_exists(0, img_path): set_wallpaper(global_data['type'], img_path) else: print('壁纸更换失败:图片不存在', 'path:' + img_path) # images_index更新 if images_index + 1 < len(global_data['data']): images_index = images_index + 1 set_config('images_index', images_index) else: images_index = 0 set_config('images_index', images_index) print('壁纸更换程序运行完毕,将index成功改为: ' + str(images_index) + '\n') else: print('壁纸更换失败:数据为空,等待同步') # 数据同步模块 def data_synchronization(): global global_data global images_index # 同步数据及文件 if get_json(0) == get_json(2): # 数据无误 print('数据无误') else: # 数据存在差异:开始同步 # 壁纸index重置 images_index = 0 # 同步数据 print('数据存在差异:开始同步新数据') winreg.SetValueEx(CreateKey, 'online_data', 0, winreg.REG_SZ, json.dumps(global_data)) # winreg.CloseKey(CreateKey) print('本地数据同步完成') # 同步文件 print('数据存在差异:开始同步新文件') old_file_cleanup() print('开始同步新文件') for index in range(len(global_data['data'])): # 根据data里的元素数量逐个下载文件 file_data = global_data['data'][index] if isConnected(2, file_data['url']): # 判断文件下载url是否有效 downloadFile(file_data['name'], file_data['url']) print('全部文件下载完毕') # 首次运行配置数据修复模块 def repair_config(): print('config配置信息开始修复') try: # 写入reg winreg.SetValueEx(CreateKey, 'config', 0, winreg.REG_SZ, json.dumps(default_config)) print('config配置信息修复完毕') except: print("Error:[配置数据修复模块]发生未知错误") # 配置数据获取模块 def get_config(config_item_name): try: key = winreg.OpenKey(win32con.HKEY_CURRENT_USER, program_reg_path, 0, win32con.KEY_ALL_ACCESS) config_data, type = winreg.QueryValueEx(key, "config") data = json.loads(config_data) return data[config_item_name] except FileNotFoundError: print('Warning:config为空') repair_config() return 0 except: print("Error:reg无法读取config") # 配置数据修改模块 def set_config(config_item_name, value): try: # 先读取config key = winreg.OpenKey(win32con.HKEY_CURRENT_USER, program_reg_path, 0, win32con.KEY_ALL_ACCESS) config_data, type = winreg.QueryValueEx(key, "config") data = json.loads(config_data) # 再修改config data[config_item_name] = value # 写入reg winreg.SetValueEx(CreateKey, 'config', 0, winreg.REG_SZ, json.dumps(data)) except FileNotFoundError: print('Error:set_config config读取失败') except: print("Error:[配置数据修改模块]发生未知错误") # 管理员权限判断模块 def is_admin(): try: return ctypes.windll.shell32.IsUserAnAdmin() except: return False ## ////////////////////////////////////////////////////////run区//////////////////////////////////////////////////////// def start(): global global_data if global_data is None: # 判断运行条件是否满足 # print('没有获取到数据,不满足运行条件,程序退出') print('初次运行,先等待5分钟(直到与服务器通信恢复)') time.sleep(5) start() else: # 有数据,运行条件满足(程序非第一次运行没有网络) print('网络已连接,开始同步数据') if global_data['status'] == 1: # 启动 print('程序启用状态') data_synchronization() else: print('程序关闭状态') exit() print('所有程序运行完毕,结束进程') def run(): global global_data global images_index global_data = get_json(0) print(global_data) data = global_data images_index = get_config('images_index') start() # 启动时第一次同步数据 # 启动线程 schedule.every(data['update_time']).seconds.do(data_synchronization) schedule.every(data['refresh_time']).seconds.do(wallpaper) print('当前更新速度' + str(data['update_time'])) print('当前刷新速度' + str(data['refresh_time'])) print('上次运行images_index:' + str(images_index)) print('程序初始化完毕', '/' * 300) # 线程计时器 while True: schedule.run_pending() time.sleep(1) ## ////////////////////////////////////////////////////////启动区//////////////////////////////////////////////////////// if is_admin(): print("以管理员权限运行") run() else: if sys.version_info[0] == 3: print('没有管理员权限:启动admin线程') ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 0) # 1:前台运行 0:后台运行 print('user权限运行结束') API格式(json):{ "time": 1664757166, "status": 1, "type": 2, "update_time": 3600, "refresh_time": 5, "style": { "WallpaperStyle": 1, "TileWallpaper": 0 }, "data": [ { "name": "jacksen168_Wallpaper_021_LOGO.jpg", "url": "https://jacksen168.top/img/last.jpg" } ] } 含义名称含义值time时间戳(可用于程序检查是否需要更新)默认时间戳status程序状态(程序的状态开关)0(关闭)/1(开启)type程序更换壁纸类型(普通=win10设置中的背景修改)1(普通更换)/2(防修改更换)update_time检查更新时间(毫秒)时间(毫秒)refresh_time壁纸刷新时间(毫秒)时间(毫秒)style->WallpaperStyle更换壁纸样式(对应win10设置中的背景契合度)0=居中 ,1=平铺 ,2=拉伸style->TileWallpaper无兼容type=1模式,无含义data->[]->name保存到本地图片的名称图片.jpg/图片.pngdata->[]->url需要下载的图片网址(url)例子: http://baidu.com/LOGO.jpg{callout color="#f0ad4e"}type=2: style->WallpaperStyle值说明:0[居中] = 如果图片与屏幕分辨率不同会出现 黑边/显示不全1[平铺] = 如果图片与屏幕分辨率不同会出现 多张平铺/显示不全2[拉伸] = 如果图片与屏幕比例不同则会拉伸变形,反之相同则能无视分辨率完美贴合边缘显示{/callout}data与普通版一样是个数组,同样可选择多张壁纸进行循环播放
2023年02月26日
17 阅读
0 评论
0 点赞
2023-01-07
html 生成一对符合对比度需求的对比色 及对颜色间的对比度探究
前言往往前端工程师在选择文本颜色和背景色上一直很头疼,选择的颜色和背景色比例过小的话就会出现看文字眼花的情况,如:适合阅读的 色彩对比度比例不小于 4.5:1适合老年人阅读的 不小于7:1这里分享一个网站: 色彩对比度检查器 (点击跳转)下面给大家分享能够生成一对自定义颜色对比度的方法随机生成一对能自定义颜色对比比例的颜色 javascript代码//颜色生成 function Generate_contrast_color(strength, min_contrast, max_contrast) { // 随机一个16位颜色 function getRandomColor() { let color = Math.floor((Math.random() * 256 * 256 * 256)).toString(16) while (color.length < 6) {//随机生成的可能只有3-6位字符串 color += Math.floor((Math.random() * 16)).toString(16) } return '#' + color; } //16进制转RGB function colorToRGB(type, color) { let color1, color2, color3; color = '' + color; if (typeof color !== 'string') return; if (color.charAt(0) == '#') { color = color.substring(1); } if (color.length == 3) { color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2]; } if (/^[0-9a-fA-F]{6}$/.test(color)) { color1 = parseInt(color.substr(0, 2), 16); color2 = parseInt(color.substr(2, 2), 16); color3 = parseInt(color.substr(4, 2), 16); if (type == 1) { return `rgb(${color1},${color2},${color3})`; } else { return [color1, color2, color3]; } } }; //判断颜色灰度 核心原理:颜色于白色进行对比 //color 颜色 ,数据类型16位哈希颜色 或 rgb值的数组:[255,255,255] function islight(color) { function luminance(r, g, b) { var a = [r, g, b].map(function (v) { v /= 255; return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); }); return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722; } function contrast(color) {//返回值范围 1 ~ 21 if (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(color)) { rgb = colorToRGB(2, color); } else { rgb = color; } var lum1 = luminance(255, 255, 255); var lum2 = luminance(rgb[0], rgb[1], rgb[2]); var brightest = Math.max(lum1, lum2); var darkest = Math.min(lum1, lum2); return (brightest + 0.05) / (darkest + 0.05); } if (contrast(color) < 11) {//值小于11表示鲜艳,大于11表示暗淡 //颜色鲜艳 return true } else { //颜色暗淡 return false } }; // 生成对比色 function lightColor(sColor, iStep) { var asHex = new Array(16); var haxString = '0123456789abcdef'; for (var i = 0; i < 16; i++) { asHex[i] = haxString.substr(i, 1); } var sRslt = "#"; var iTemp; for (var i = 1; i < 7; i++) { iTemp = parseInt("0x" + sColor.substr(i, 1)) + iStep; if (iTemp > 15) iTemp = 15; if (iTemp < 0) iTemp = 0; sRslt += asHex[iTemp]; } return sRslt; } //将颜色按照暗亮自动前往对比 function autolightColor(color, istep) { if (!islight(color)) { //暗色 return lightColor(color, istep); } else { //亮色 return lightColor(color, -istep) } } //计算两色的对比度比例 //colorA 颜色1 输入16位哈希 或 rgb值的数组:[255,255,255] //colorB 颜色1 输入16位哈希 或 rgb值的数组:[255,255,255] function getContrastRatio(colorA, colorB) { if (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(colorA)) { colorA = colorToRGB(2, colorA); } if (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(colorB)) { colorB = colorToRGB(2, colorB); } function getLuminanace(values) { var rgb = values.map((v) => { var val = v / 255; return val <= 0.03928 ? val / 12.92 : ((val + 0.055) / 1.055) ** 2.4; }); return Number((0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]).toFixed(3)); }; var lumA = getLuminanace(colorA); var lumB = getLuminanace(colorB); var calculation = (Math.max(lumA, lumB) + 0.05) / (Math.min(lumA, lumB) + 0.05); return calculation.toFixed(2); }; //随机一对 let i = 0; do {//不是任意一对颜色都是有合适的对比率的,又时初始颜色偏激,但范围有限会导致对出来的颜色对比度不合格 i++; var color = getRandomColor(); var ContrastColor = autolightColor(color, strength); var ContrastRatio = getContrastRatio(color, ContrastColor); if (min_contrast < ContrastRatio && ContrastRatio < max_contrast) { return [color, ContrastColor, ContrastRatio] } } while (i < 10000)//阀门 console.log('经循环10000次,没有合适的一对,返回白色和黑色'); return ['#fff', '#000', 21] } //Generate_contrast_color(strength, min_contrast, max_contrast) //strength = 两色偏移强度; 范围0 ~ 20 ;必须整数 //min_contrast = 最小对比度比例; 范围1 ~ 21 //max_contrast = 最大对比度比例; 范围1 ~ 21 /*--最后生成的颜色对比度比例在 最小对比度比例 和 最大对比度比例 之间。错误返回白色和黑色--*/ /* 返回值: ["#b0b6ce","#404057","5.01"] [ 颜色1 , 颜色2 , 两色对比比例 ] */ var color = Generate_contrast_color(7, 4.5, 21); var color1 = color[0]; var color2 = color[1]; var ContrastRatio = color[2];其余便是分支:如果需要将16位颜色转换成rgb可以这样://16进制转RGB function colorToRGB(color) { let color1, color2, color3; color = '' + color; if (typeof color !== 'string') return; if (color.charAt(0) == '#') { color = color.substring(1); } if (color.length == 3) { color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2]; } if (/^[0-9a-fA-F]{6}$/.test(color)) { color1 = parseInt(color.substr(0, 2), 16); color2 = parseInt(color.substr(2, 2), 16); color3 = parseInt(color.substr(4, 2), 16); return `rgb(${color1},${color2},${color3})`; } };颜色偏移://颜色偏移 //sColor 16位哈希颜色 如:#99cf42 //iStep 偏移力度 0 ~ 20 function lightColor(sColor, iStep) { var asHex = new Array(16); var haxString = '0123456789abcdef'; for (var i = 0; i < 16; i++) { asHex[i] = haxString.substr(i, 1); } var sRslt = "#"; var iTemp; for (var i = 1; i < 7; i++) { iTemp = parseInt("0x" + sColor.substr(i, 1)) + iStep; if (iTemp > 15) iTemp = 15; if (iTemp < 0) iTemp = 0; sRslt += asHex[iTemp]; } return sRslt; }计算两个颜色的对比度比例://16进制转RGB function colorToRGB(type, color) { let color1, color2, color3; color = '' + color; if (typeof color !== 'string') return; if (color.charAt(0) == '#') { color = color.substring(1); } if (color.length == 3) { color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2]; } if (/^[0-9a-fA-F]{6}$/.test(color)) { color1 = parseInt(color.substr(0, 2), 16); color2 = parseInt(color.substr(2, 2), 16); color3 = parseInt(color.substr(4, 2), 16); if (type == 1) { return `rgb(${color1},${color2},${color3})`; } else { return [color1, color2, color3]; } } }; //计算两色的对比度比例 //colorA 颜色1 输入16位哈希 或 rgb值的数组:[255,255,255] //colorB 颜色1 输入16位哈希 或 rgb值的数组:[255,255,255] function getContrastRatio(colorA, colorB) { if (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(colorA)) { colorA = colorToRGB(2, colorA); } if (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(colorB)) { colorB = colorToRGB(2, colorB); } function getLuminanace(values) { var rgb = values.map((v) => { var val = v / 255; return val <= 0.03928 ? val / 12.92 : ((val + 0.055) / 1.055) ** 2.4; }); return Number((0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]).toFixed(3)); }; var lumA = getLuminanace(colorA); var lumB = getLuminanace(colorB); var calculation = (Math.max(lumA, lumB) + 0.05) / (Math.min(lumA, lumB) + 0.05); return calculation.toFixed(2); };判断颜色是否鲜艳//16进制转RGB function colorToRGB(type, color) { let color1, color2, color3; color = '' + color; if (typeof color !== 'string') return; if (color.charAt(0) == '#') { color = color.substring(1); } if (color.length == 3) { color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2]; } if (/^[0-9a-fA-F]{6}$/.test(color)) { color1 = parseInt(color.substr(0, 2), 16); color2 = parseInt(color.substr(2, 2), 16); color3 = parseInt(color.substr(4, 2), 16); if (type == 1) { return `rgb(${color1},${color2},${color3})`; } else { return [color1, color2, color3]; } } }; //判断颜色灰度 核心原理:颜色于白色进行对比 //color 颜色 ,数据类型16位哈希颜色 或 rgb值的数组:[255,255,255] function islight(color) { function luminance(r, g, b) { var a = [r, g, b].map(function (v) { v /= 255; return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); }); return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722; } function contrast(color) {//返回值范围 1 ~ 21 if (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(color)) { rgb = colorToRGB(2, color); } else { rgb = color; } var lum1 = luminance(255, 255, 255); var lum2 = luminance(rgb[0], rgb[1], rgb[2]); var brightest = Math.max(lum1, lum2); var darkest = Math.min(lum1, lum2); return (brightest + 0.05) / (darkest + 0.05); } if (contrast(color) < 11) {//值小于11表示鲜艳,大于11表示暗淡 //颜色鲜艳 return true } else { //颜色暗淡 return false } };html演示:<!DOCTYPE html> <html lang="zh_cn"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>随机一对合适的颜色,对比度比例可控,演示随机100个</title> </head> <body> <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script> <script> //颜色生成 function Generate_contrast_color(strength, min_contrast, max_contrast) { // 随机一个16位颜色 function getRandomColor() { let color = Math.floor((Math.random() * 256 * 256 * 256)).toString(16) while (color.length < 6) {//随机生成的可能只有3-6位字符串 color += Math.floor((Math.random() * 16)).toString(16) } return '#' + color; } //16进制转RGB function colorToRGB(type, color) { let color1, color2, color3; color = '' + color; if (typeof color !== 'string') return; if (color.charAt(0) == '#') { color = color.substring(1); } if (color.length == 3) { color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2]; } if (/^[0-9a-fA-F]{6}$/.test(color)) { color1 = parseInt(color.substr(0, 2), 16); color2 = parseInt(color.substr(2, 2), 16); color3 = parseInt(color.substr(4, 2), 16); if (type == 1) { return `rgb(${color1},${color2},${color3})`; } else { return [color1, color2, color3]; } } }; //判断颜色灰度 核心原理:颜色于白色进行对比 //color 颜色 ,数据类型16位哈希颜色 或 rgb值的数组:[255,255,255] function islight(color) { function luminance(r, g, b) { var a = [r, g, b].map(function (v) { v /= 255; return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); }); return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722; } function contrast(color) {//返回值范围 1 ~ 21 if (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(color)) { rgb = colorToRGB(2, color); } else { rgb = color; } var lum1 = luminance(255, 255, 255); var lum2 = luminance(rgb[0], rgb[1], rgb[2]); var brightest = Math.max(lum1, lum2); var darkest = Math.min(lum1, lum2); return (brightest + 0.05) / (darkest + 0.05); } if (contrast(color) < 11) {//值小于11表示鲜艳,大于11表示暗淡 //颜色鲜艳 return true } else { //颜色暗淡 return false } }; // 生成对比色 function lightColor(sColor, iStep) { var asHex = new Array(16); var haxString = '0123456789abcdef'; for (var i = 0; i < 16; i++) { asHex[i] = haxString.substr(i, 1); } var sRslt = "#"; var iTemp; for (var i = 1; i < 7; i++) { iTemp = parseInt("0x" + sColor.substr(i, 1)) + iStep; if (iTemp > 15) iTemp = 15; if (iTemp < 0) iTemp = 0; sRslt += asHex[iTemp]; } return sRslt; } //将颜色按照暗亮自动前往对比 function autolightColor(color, istep) { if (!islight(color)) { //暗色 return lightColor(color, istep); } else { //亮色 return lightColor(color, -istep) } } //计算两色的对比度比例 //colorA 颜色1 输入16位哈希 或 rgb值的数组:[255,255,255] //colorB 颜色1 输入16位哈希 或 rgb值的数组:[255,255,255] function getContrastRatio(colorA, colorB) { if (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(colorA)) { colorA = colorToRGB(2, colorA); } if (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(colorB)) { colorB = colorToRGB(2, colorB); } function getLuminanace(values) { var rgb = values.map((v) => { var val = v / 255; return val <= 0.03928 ? val / 12.92 : ((val + 0.055) / 1.055) ** 2.4; }); return Number((0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]).toFixed(3)); }; var lumA = getLuminanace(colorA); var lumB = getLuminanace(colorB); var calculation = (Math.max(lumA, lumB) + 0.05) / (Math.min(lumA, lumB) + 0.05); return calculation.toFixed(2); }; //随机一对 let i = 0; do {//不是任意一对颜色都是有合适的对比率的,又时初始颜色偏激,但范围有限会导致对出来的颜色对比度不合格 i++; var color = getRandomColor(); var ContrastColor = autolightColor(color, strength); var ContrastRatio = getContrastRatio(color, ContrastColor); if (min_contrast < ContrastRatio && ContrastRatio < max_contrast) { return [color, ContrastColor, ContrastRatio] } } while (i < 10000)//阀门 console.log('经循环10000次,没有合适的一对,返回白色和黑色'); return ['#fff', '#000', 21] } //Generate_contrast_color(strength, min_contrast, max_contrast) //strength = 两色偏移强度; 范围0 ~ 20 ;必须整数 //min_contrast = 最小对比度比例; 范围1 ~ 21 //max_contrast = 最大对比度比例; 范围1 ~ 21 /*--最后生成的颜色对比度比例在 最小对比度比例 和 最大对比度比例 之间。错误返回白色和黑色--*/ /* 返回值: ["#b0b6ce","#404057","5.01"] [ 颜色1 , 颜色2 , 两色对比比例 ] */ var color = Generate_contrast_color(7, 4.5, 21); var color1 = color[0]; var color2 = color[1]; var ContrastRatio = color[2]; /*----------------------下面为演示代码---------------------*/ function setStyle(el, styles) { for (var key in styles) { el.style[key] = styles[key]; } } for (let index = 0; index < 100; index++) { div = document.createElement('div'); div.id = index; document.body.appendChild(div); var color = Generate_contrast_color(7, 4.5, 21); var color1 = color[0]; var color2 = color[1]; var ContrastRatio = color[2]; var span = document.createElement("span"); span.innerText = "文本文字"; setStyle(span, { display: 'inline-block', padding: '10px', margin: '30px', textAlign: 'center', color: color1, 'background-color': color2 }); document.getElementById(index).appendChild(span); span = document.createElement("span"); var text = " 文字颜色:" + color1 + ' 背景颜色:' + color2 + '; 对比率:' + ContrastRatio; span.innerText = text; document.getElementById(index).appendChild(span); } </script> </body> </html>创造不易,麻烦转载留个言
2023年01月07日
16 阅读
0 评论
0 点赞
2023-01-06
html 实现动态视频背景
前言最近迷上了动态视频背景, wallpap engine都能逛上一天( {x} {x} { } )。看着桌面都能使用动态壁纸,于是我也想在html上实现video标签是浏览器的默认视频标签,我也考虑过可能不同的浏览器会对视频标签进行修改,导致浏览器兼容问题。但我是真的没有找到其他的替代方式,想过canvas也可以实现动画,但是canvas也是使用video标签为图像源,所以就没有使用canvas,所以遇到如小米浏览器那样的浏览器就会出现一系列问题。我提出的解决方法是要么限制浏览器要么限制屏幕分辨率,我选择后者限制屏幕分辨率。这样也可以减少移动端浏览器负担,减少性能开销。代码如下:CSS#DynamicWallpaper { left: 50% !important; top: 0 !important; margin: 0 !important; display: block; position: absolute; width: 100%; height: 100%; z-index: -520; position: fixed; -webkit-transform: translateX(-50%); -ms-transform: translateX(-50%); transform: translateX(-50%); -o-object-fit: cover; object-fit: cover; -o-object-position: center; object-position: center; } @media screen and (max-width: 768px) { /*屏幕小于768px隐藏*/ #DynamicWallpaper { display: none; } }javascriptif (document.body.clientWidth >= 768) { //屏幕分辨率大于768px启用,避免屏幕小于768px通过css隐藏还会加载视频资源 var DynamicWallpaper = document.createElement("video"); //创建video元素 DynamicWallpaper.id = "DynamicWallpaper";//定义id DynamicWallpaper.src = "http://jacksen168.top/video/wallpaper.mp4";//视频链接 DynamicWallpaper.autoplay = true;//视频自动播放 DynamicWallpaper.muted = true;//视频静音(不想也可以设置为false或注释掉这一行) DynamicWallpaper.loop = true;//隐藏video视频控件 DynamicWallpaper.playbackRate = 1;//视频播放倍数 document.body.appendChild(DynamicWallpaper);//将元素添加到body里面 }
2023年01月06日
164 阅读
0 评论
0 点赞
2022-10-22
python替换win10壁纸: 对网上主流方法的补充
主流方法代码缺陷当你的win10在个性化中设置成纯色壁纸时(偶尔需要重启电脑后),主流方法就会失效。在个性化界面看的到替换变化,但桌面没有半点反应。过程终于在我废寝忘食的找了一天资料,测试了一遍又一遍后...在代码中加了一行代码解决了所有问题......问题说明这次我也不知道是不是网上主流方法的问题,在那么多遍的测试中,我只得出来一条结论:微软你就是歌姬吧。问题所在:微软在winXP时的旧代码一直屯到现在。导致win10的壁纸显示规则十分的混乱,壁纸更换涉及到注册表的8个值和一个文件夹里的配置文件,更换壁纸的方法数不胜数,并且他们之间还互相干扰,令人头疼。最后我在注册表 HKEY_CURRENT_USER\Control Panel\Desktop 里的 wallpaper 值里加上图片路径才解决这个问题。这样改就最贴合从个性化里手动点击修改了。代码import os, win32gui, win32con, win32api def set_wallpaper(img_path): # 打开指定注册表路径 reg_key = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER, "Control Panel\\Desktop", 0, win32con.KEY_SET_VALUE) # 最后的参数:2拉伸,0居中,6适应,10填充,0平铺 win32api.RegSetValueEx(reg_key, "WallpaperStyle", 0, win32con.REG_SZ, "10") # 最后的参数:1表示平铺,拉伸居中等都是0 win32api.RegSetValueEx(reg_key, "TileWallpaper", 0, win32con.REG_SZ, "0") # 通过注册表来修改壁纸(更贴进手动设置,比下面那个优先级要高。可避免背景设置成纯色重启电脑后,出现无法更换壁纸的情况) win32api.RegSetValueEx(reg_key, "WallPaper", 0, win32con.REG_SZ, img_path.replace('/', '\\')) # 注意上方的 img_path.replace('/', '\\') 是将url的"/"线换成"\"线,注册表只认"\"线 # 刷新桌面与设置壁纸 win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, img_path, win32con.SPIF_SENDWININICHANGE) # 注意路径书写问题; "/"左滑线,"\"右滑线都可以 img_path = "C:/Pictures/win10.jpg" # 切换时要检查一下图片是否存在 if os.path.exists(img_path): print('壁纸切换成功:' + img_path) set_wallpaper(img_path) else: print('图片不存在,切换失败') 注意事项win32api.RegSetValueEx(reg_key, "WallPaper", 0, win32con.REG_SZ, img_path.replace('/', '\\'))里的片段: img_path.replace('/', '\\') 是将img_path路径的"/"线换成"\",注册表只认"\"线原主流代码import os, win32gui, win32con, win32api def set_wallpaper(img_path): # 打开指定注册表路径 reg_key = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER, "Control Panel\\Desktop", 0, win32con.KEY_SET_VALUE) # 最后的参数:2拉伸,0居中,6适应,10填充,0平铺 win32api.RegSetValueEx(reg_key, "WallpaperStyle", 0, win32con.REG_SZ, "10") # 最后的参数:1表示平铺,拉伸居中等都是0 win32api.RegSetValueEx(reg_key, "TileWallpaper", 0, win32con.REG_SZ, "0") # 刷新桌面与设置壁纸 win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, img_path, win32con.SPIF_SENDWININICHANGE) # 注意路径书写问题 img_path = "C:/Pictures/win10.jpg" # 切换时要检查一下图片是否存在 if os.path.exists(img_path): set_wallpaper(img_path) else: print('图片不存在,切换失败')
2022年10月22日
21 阅读
0 评论
0 点赞
1
2
3
开启动态视频
开启live2D
开启帧数显示