You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python检测并终止触发鼠标点击事件的进程(反作弊)

可以用Python实现检测触发鼠标点击的进程并终止吗?

是的,完全可以在Python中实现类似你朋友提供的C#代码的功能,通过调用Windows API捕获鼠标事件、定位触发事件的进程并将其终止,适用于反作弊场景。以下是具体实现思路和代码示例:

核心原理

和你提供的C#代码逻辑一致,我们需要借助Windows的**低级鼠标钩子(WH_MOUSE_LL)**全局捕获鼠标点击事件。当捕获到事件后,通过事件关联的窗口句柄获取对应进程ID,最后调用系统API终止该进程。

实现步骤

  1. 调用Windows API:使用ctypes库调用user32.dll和kernel32.dll中的函数,对应C#里的DllImport操作。
  2. 注册鼠标钩子:设置低级鼠标钩子,指定回调函数处理捕获到的鼠标事件。
  3. 获取进程ID:在回调函数中,从鼠标事件结构体中提取窗口句柄,再通过GetWindowThreadProcessId获取进程ID。
  4. 终止目标进程:使用系统API或第三方库终止指定进程。

Python代码示例

方法一:纯ctypes实现(贴近C#逻辑)

import ctypes
from ctypes import wintypes
import time

# 加载Windows系统库
user32 = ctypes.WinDLL('user32', use_last_error=True)
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)

# 钩子类型和鼠标事件常量
WH_MOUSE_LL = 14
WM_LBUTTONDOWN = 0x0201
WM_RBUTTONDOWN = 0x0204
WM_MBUTTONDOWN = 0x0207

# 定义钩子回调函数类型
HOOKPROC = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int, wintypes.WPARAM, wintypes.LPARAM)

# 定义鼠标钩子结构体
class MSLLHOOKSTRUCT(ctypes.Structure):
    _fields_ = [
        ('pt', wintypes.POINT),
        ('mouseData', wintypes.DWORD),
        ('flags', wintypes.DWORD),
        ('time', wintypes.DWORD),
        ('dwExtraInfo', wintypes.LPARAM)
    ]

# 声明API函数参数和返回值类型
user32.SetWindowsHookExA.argtypes = [ctypes.c_int, HOOKPROC, wintypes.HINSTANCE, wintypes.DWORD]
user32.SetWindowsHookExA.restype = wintypes.HHOOK

user32.UnhookWindowsHookEx.argtypes = [wintypes.HHOOK]
user32.UnhookWindowsHookEx.restype = wintypes.BOOL

user32.CallNextHookEx.argtypes = [wintypes.HHOOK, ctypes.c_int, wintypes.WPARAM, wintypes.LPARAM]
user32.CallNextHookEx.restype = ctypes.c_int

user32.GetWindowThreadProcessId.argtypes = [wintypes.HWND, wintypes.LPDWORD]
user32.GetWindowThreadProcessId.restype = wintypes.DWORD

user32.GetForegroundWindow.argtypes = []
user32.GetForegroundWindow.restype = wintypes.HWND

kernel32.TerminateProcess.argtypes = [wintypes.HANDLE, wintypes.UINT]
kernel32.TerminateProcess.restype = wintypes.BOOL

kernel32.OpenProcess.argtypes = [wintypes.DWORD, wintypes.BOOL, wintypes.DWORD]
kernel32.OpenProcess.restype = wintypes.HANDLE

PROCESS_TERMINATE = 0x0001

# 钩子回调函数:处理鼠标事件并终止进程
def mouse_hook_proc(nCode, wParam, lParam):
    if nCode >= 0:
        # 检测鼠标点击事件
        if wParam in (WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN):
            # 获取当前前台窗口的进程ID
            hwnd = user32.GetForegroundWindow()
            pid = wintypes.DWORD()
            user32.GetWindowThreadProcessId(hwnd, ctypes.byref(pid))
            pid = pid.value
            print(f"检测到鼠标点击,触发进程ID: {pid}")
            
            # 终止进程(可添加自定义判断逻辑,比如只终止特定进程)
            h_process = kernel32.OpenProcess(PROCESS_TERMINATE, False, pid)
            if h_process:
                kernel32.TerminateProcess(h_process, 0)
                print(f"已终止进程ID: {pid}")
                kernel32.CloseHandle(h_process)
    
    return user32.CallNextHookEx(None, nCode, wParam, lParam)

# 注册钩子
hook_proc = HOOKPROC(mouse_hook_proc)
hook_handle = user32.SetWindowsHookExA(WH_MOUSE_LL, hook_proc, kernel32.GetModuleHandleA(None), 0)

if not hook_handle:
    raise ctypes.WinError(ctypes.get_last_error())

try:
    # 消息循环:保持钩子持续运行
    msg = wintypes.MSG()
    while user32.GetMessageA(ctypes.byref(msg), None, 0, 0) != 0:
        user32.TranslateMessage(ctypes.byref(msg))
        user32.DispatchMessageA(ctypes.byref(msg))
finally:
    user32.UnhookWindowsHookEx(hook_handle)

方法二:用psutil简化进程操作

如果觉得直接调用系统API繁琐,可以使用psutil库更便捷地管理进程:

# 先安装psutil:pip install psutil
import psutil

# 在回调函数中替换终止进程的代码:
if pid:
    try:
        process = psutil.Process(pid)
        process.terminate()
        print(f"已终止进程: {process.name()} (ID: {pid})")
    except psutil.NoSuchProcess:
        print(f"进程ID {pid}不存在")

关键注意事项

  • 管理员权限:终止系统进程或受保护的作弊进程时,需要以管理员身份运行Python脚本。
  • 误杀防范:必须添加严格的判断逻辑(比如只终止特定名称/路径的进程),避免误杀正常程序。
  • 钩子生命周期:低级钩子依赖消息循环运行,脚本不能退出,否则钩子会失效。
  • 反作弊对抗:部分作弊软件会检测钩子或保护自身进程,可能需要额外的对抗策略(如隐藏钩子、驱动级监控等)。

内容的提问来源于stack exchange,提问作者N3woX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:43:15