好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 a87946001 于 2025-9-24 09:02 编辑
最近看到一位老哥写了一个python的多开源码,然后想着能不能套个UI界面,在此基础上写的,测试了一下,记事本和微信多开都可以,其他更多并未测试,如果有写的不好的地方指正指正,原文链接https://www.52pojie.cn/thread-2012350-1-11.html
import os
import ctypes
from ctypes import wintypes
import tkinter as tk
from tkinter import filedialog
# 加载必要的 Windows API 函数
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
advapi32 = ctypes.WinDLL('advapi32', use_last_error=True)
# 定义常量
SECURITY_WORLD_SID_AUTHORITY = (0, 0, 0, 0, 0, 1) # SID 标识符
SECURITY_WORLD_RID = 0 # 世界 SID 的 RID
ACL_REVISION = 2 # ACL 版本
SE_KERNEL_OBJECT = 6 # 内核对象类型
DACL_SECURITY_INFORMATION = 0x00000004 # DACL 安全信息标志
MUTEX_ALL_ACCESS = 0x1F0001 # 互斥体的完全访问权限
# 定义函数参数和返回类型
kernel32.CreateMutexW.argtypes = [wintypes.LPVOID, wintypes.BOOL, wintypes.LPCWSTR]
kernel32.CreateMutexW.restype = wintypes.HANDLE
advapi32.AllocateAndInitializeSid.argtypes = [
ctypes.POINTER(ctypes.c_byte), # SID_IDENTIFIER_AUTHORITY
ctypes.c_byte, # SubAuthorityCount
ctypes.c_ulong, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_ulong,
ctypes.c_ulong, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_ulong,
ctypes.POINTER(ctypes.c_void_p) # PSID
]
advapi32.AllocateAndInitializeSid.restype = wintypes.BOOL
advapi32.InitializeAcl.argtypes = [wintypes.LPVOID, wintypes.DWORD, wintypes.DWORD]
advapi32.InitializeAcl.restype = wintypes.BOOL
advapi32.AddAccessDeniedAce.argtypes = [wintypes.LPVOID, wintypes.DWORD, wintypes.DWORD, wintypes.LPVOID]
advapi32.AddAccessDeniedAce.restype = wintypes.BOOL
advapi32.SetSecurityInfo.argtypes = [
wintypes.HANDLE, wintypes.DWORD, wintypes.DWORD, wintypes.LPVOID, wintypes.LPVOID,
wintypes.LPVOID, wintypes.LPVOID
]
advapi32.SetSecurityInfo.restype = wintypes.DWORD
class OpenPage:
def __init__(self, master):
self.root = master
self.root.geometry('600x400')
self.root.iconbitmap(r"I:\python_code\students\bitbug_favicon.ico")
self.root.title('程序多开器 v0.0.1')
self.page = tk.Frame(self.root)
self.page.pack()
tk.Label(self.page).grid(row=0, column=0, pady=50) # 空白标签
self.label1 = tk.Label(self.page, text='路径:')
self.label1.grid(row=1, column=1, pady=10) # 第一行第一列标签
self.path = tk.StringVar() # 定义变量
self.label2 = tk.Label(self.page)
self.label2.grid(row=1, column=2, pady=10) # 第一行第二列输入框
tk.Button(self.page, text='获取', command=self.get_path).grid(row=4, column=1) # 第三行第一列按钮
self.num = tk.StringVar() # 定义变量
tk.Label(self.page, text='数量:').grid(row=3, column=1, pady=10) # 第二行第一列标签
tk.Entry(self.page, textvariable=self.num).grid(row=3, column=2, pady=10) # 第二行第二列输入框
tk.Button(self.page, text='打开', command=self.mains).grid(row=4, column=2, stick=tk.E) # 第三行第二列按钮
def get_path(self):
self.folder_path = filedialog.askopenfilename()
self.label2.config(text=self.folder_path)
def Create_wechat_Mutex(self):
# 创建一个互斥体,微信使用该互斥体确保单实例运行
h_mutex = kernel32.CreateMutexW(None, False, "_WeChat_App_Instance_Identity_Mutex_Name")
if not h_mutex:
raise ctypes.WinError(ctypes.get_last_error())
# 定义 SID_IDENTIFIER_AUTHORITY 结构
sid_auth_world = (ctypes.c_byte * 6)(*SECURITY_WORLD_SID_AUTHORITY)
# 为 Everyone 组分配并初始化 SID
p_everyone_sid = ctypes.c_void_p()
if not advapi32.AllocateAndInitializeSid(
ctypes.cast(ctypes.byref(sid_auth_world), ctypes.POINTER(ctypes.c_byte)),
# 正确传递 SID_IDENTIFIER_AUTHORITY
1, # SubAuthorityCount
SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, # SubAuthorities
ctypes.byref(p_everyone_sid) # PSID
):
raise ctypes.WinError(ctypes.get_last_error())
# 初始化 ACL
sz_buffer = (ctypes.c_byte * 4096)()
p_acl = ctypes.cast(sz_buffer, ctypes.POINTER(ctypes.c_byte))
if not advapi32.InitializeAcl(p_acl, ctypes.sizeof(sz_buffer), ACL_REVISION):
raise ctypes.WinError(ctypes.get_last_error())
# 向 ACL 添加拒绝访问的 ACE(访问控制条目)
if not advapi32.AddAccessDeniedAce(p_acl, ACL_REVISION, MUTEX_ALL_ACCESS, p_everyone_sid):
raise ctypes.WinError(ctypes.get_last_error())
# 设置互斥体的安全信息,修改其 ACL
result = advapi32.SetSecurityInfo(
h_mutex, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, None, None, p_acl, None
)
if result != 0:
raise ctypes.WinError(result)
def mains(self):
try:
open_wx_num = int(self.num.get())
except:
open_wx_num = 1
path = self.folder_path
try:
self.Create_wechat_Mutex()
except:
pass
for i in range(open_wx_num):
os.startfile(path)
if __name__ == '__main__':
root = tk.Tk()
OpenPage(root)
root.mainloop()
打包好的网盘链接:通过网盘分享的文件:多开.exe
链接: https://pan.baidu.com/s/1q_aI6QaW0jZ-nupkgbUbjw?pwd=bmp2 提取码: bmp2
|
-
免费评分
-
查看全部评分
|