由来:
因为连连控官方的结束控制之后的锁屏需要付费,所以变相的使用本文的方式来实现这个功能,肯定没有原来的丝滑和准确,但是勉强够用。不会造成什么影响,因为这个软件需要在被控端安装与官方原理不同。
软件功能介绍:
- 常驻后台,循环检测连连控窗口以及进程
- 没有任务栏图标以及窗口图标显示,可以放在电脑自启动文件夹自启动,也可双击手动启动。
- 启动完成想要关闭,必须任务管理器关闭。
- 软件启动期间作为被控端,如果控制端连接断开之后,自动锁屏,目前没有设置界面。直接双击运行
- 双击运行之后没有任何干扰,唯一的干扰就是,可能判断不了是被控还是控制时会弹出一个确认的弹框。
- 此软件完全使用Python编写,没有任何远程联网操作,全部在本地进行。
原理:
- 连连控的进程名称是“连连控”或者“AskLink.exe”
- 连连控的控制窗口名称是“连连控”
- 通过检测进程以及窗口的变化来辨识是否被控结束。
运行图片:
下载地址:
蓝奏云下载链接 https://wwoh.lanzouw.com/ivOEd2ezbw5a
请认准此贴,此链接为原创一手网盘链接,保证无毒。其他任何地方本工具均不保证。
附录
代码如下,不放心可以自行编译。此贴只在吾爱破解原创发布。
import psutil
import pygetwindow as gw
import ctypes
import time
import threading
import tkinter as tk
from tkinter import messagebox
from win10toast import ToastNotifier
# 常量
# 支持不同电脑上的进程名称
PROCESS_NAME = ["连连控", "AskLink.exe"] # 连连控进程名称可以是“连连控”或“AskLink.exe”
WINDOW_NAME = "连连控" # 连连控控制窗口名称
# 用于存储PID
latest_pids = set()
normal_pids = set()
controlled_pids = set()
controlling_pids = set()
shoudongpanduan = 0 # 用于标记是否需要弹出确认窗口,手动判断是否被控
def set_process_name(name):
"""设置进程名称"""
try:
ctypes.windll.kernel32.SetConsoleTitleW(name)
except Exception as e:
print(f"无法修改进程名称: {e}")
def lock_screen():
"""模拟锁屏操作"""
ctypes.windll.user32.LockWorkStation()
def get_process_pids(process_names):
"""获取指定进程的所有PID(支持多个进程名称)"""
pids = set()
for proc in psutil.process_iter(attrs=['pid', 'name']):
if proc.info['name'] in process_names:
pids.add(proc.info['pid'])
return pids
def get_window_count(window_name):
"""获取指定窗口名称的窗口数量(完全匹配)"""
windows = gw.getWindowsWithTitle(window_name)
return len([win for win in windows if win.title == window_name])
def show_confirm_dialog():
"""弹出确认框,询问用户是否正在被控"""
root = tk.Tk()
root.withdraw() # 隐藏主窗口
# 创建一个新的顶级窗口,并使其置顶
top = tk.Toplevel(root)
top.withdraw()
top.attributes('-topmost', True) # 设置窗口置顶
response = messagebox.askyesno("确认", "无法判断状态,是否正在被控?", parent=top)
top.destroy() # 在对话框关闭后销毁顶级窗口
return response
def show_notification(title, message):
"""使用 win10toast 显示通知"""
toaster = ToastNotifier()
toaster.show_toast(title, message, duration=10) # 持续10秒
def check_state():
"""检查当前系统状态"""
global normal_pids, controlled_pids, controlling_pids, latest_pids, shoudongpanduan
# 获取当前“连连控”进程的PID
current_pids = get_process_pids(PROCESS_NAME)
window_count = get_window_count(WINDOW_NAME)
if current_pids == latest_pids:
return
else:
is_lock = True
# 获取任务管理器中的进程数量
current_process_count = len(current_pids)
print(window_count)
# 判断不同状态
if window_count == 0:
if current_process_count == 3 or current_process_count == 2:
# 正常状态
normal_pids = current_pids
# 判断不同状态
elif window_count == 1:
if current_process_count == 5:
# 处于“被控”状态
controlled_pids = current_pids
elif current_process_count == 3:
# 正常状态
normal_pids = current_pids
elif window_count == 2:
if current_process_count == 5:
# 处于“控制别人”状态
print("处于“控制别人”状态")
shoudongpanduan = 1 if show_confirm_dialog() else 0
if not shoudongpanduan:
controlling_pids = current_pids
else:
is_lock = False
elif current_process_count == 7:
# 处于“既被控又控制别人”状态
controlled_pids = current_pids
controlling_pids = current_pids
is_lock = False
else:
# 无法判断,弹出确认窗口
print("无法判断状态,弹出确认窗口")
shoudongpanduan = 1 if show_confirm_dialog() else 0
is_lock = False
print(normal_pids, controlled_pids, controlling_pids)
print(current_pids, latest_pids)
# 如果检测到“被控结束”,锁屏
if (controlled_pids and (latest_pids == controlled_pids)) or (shoudongpanduan and is_lock):
print("检测到被控结束,锁屏")
lock_screen()
controlled_pids = set()
shoudongpanduan = 0
latest_pids = current_pids
def monitor():
"""循环检测进程和窗口状态"""
while True:
check_state()
time.sleep(5) # 每隔5秒检查一次状态
def run_in_background():
"""在后台运行应用程序"""
# 使用后台线程来运行监控任务
monitoring_thread = threading.Thread(target=monitor, daemon=True)
monitoring_thread.start()
# 保持应用常驻,但不显示任务栏图标
while True:
time.sleep(100) # 让主线程保持活跃
if __name__ == "__main__":
# set_process_name("llkAutoLock") # 设置进程名称
# show_notification("程序启动", "llkAutoLock 程序已成功启动并正在运行。") # 启动时通知
run_in_background()
|