Python使用ctypes实现自动化点击与游戏脚本示例

陈默
陈默
发布时间:2026-10-14| 2人浏览过
原创

本文详解如何在Python中利用ctypes模块调用Windows动态链接库,实现高效的屏幕颜色检测与鼠标点击模拟。通过加载自定义DLL获取像素数据,结合循环逻辑判断游戏状态,完成从颜色识别到自动点击的完整流程。相比传统工具,该方法在性能与灵活性上更具优势,适合需要高频交互的自动化场景。

Python ctypes自动化点击方案概述

在探讨Python实现自动化点击之前,若需重复执行特定操作,许多人会首先想到按键精灵等工具。然而,将逻辑迁移至Python并配合自定义API后,执行效率显著提升。为了验证这一优势,下文将以一款小游戏为例,展示编写基于ctypes的点击脚本后的实际运行效果。

尽管按键精灵提供的窗口API性能表现一般,但通过Python重构整个逻辑并调用自研API,处理速度得到了大幅优化。

游戏脚本逻辑与代码实现

核心逻辑是直接调用Python接口获取特定点位的颜色值,若颜色非白色则触发点击指令,随后循环等待下一个黑色块出现。同时设置超时机制,若长时间颜色无变化,则判定游戏结束并退出程序。具体实现代码如下:

动态库加载与像素检测核心代码


WindowFunction = ctypes.windll.LoadLibrary("E:\\Python Hack\\DLL\\ScreenFunction.dll")
  DllGetPixel = WindowFunction.GetWindowPixel
  DllGetPixel.argtypes=[ctypes.wintypes.HWND,ctypes.wintypes.c_int,ctypes.wintypes.c_int]
  DllGetPixel.restypes=[ctypes.wintypes.c_uint32]
  DllGetMultiPixel = WindowFunction.GetWindowMultiPixel
  DllGetMultiPixel.argtypes=[ctypes.wintypes.HWND,ctypes.wintypes.c_void_p,ctypes.wintypes.c_void_p]
  DllGetMultiPixel.restypes=[ctypes.wintypes.c_int]
cMulti = (ctypes.wintypes.c_int * 17)(Pos0.x,Pos0.y,Pos1.x,Pos1.y,Pos2.x,Pos2.y,Pos3.x,Pos3.y,
                     Pos0.x,Pos0.y-5,Pos1.x,Pos1.y-5,Pos2.x,Pos2.y-5,Pos3.x,Pos3.y-5,
                     0)
  dwLen = DllGetMultiPixel(wHWND,byref(cMulti),None)
  RGB = (ctypes.wintypes.DWORD * dwLen)()
  quit = False
  while not quit:
    DllGetMultiPixel(wHWND,byref(cMulti),byref(RGB))    
    flag = 0
    if not RGB[0] == 0xfff5f5f5 or not RGB[4] == 0xfff5f5f5:
      EmuCursorClick(rect.left+Pos0.x,rect.top+Pos0.y)
      flag = 1
    elif not RGB[1] == 0xfff5f5f5 or not RGB[5] == 0xfff5f5f5:
      EmuCursorClick(rect.left+Pos1.x,rect.top+Pos1.y)
      flag = 2
    elif not RGB[2] == 0xfff5f5f5 or not RGB[6] == 0xfff5f5f5:
      EmuCursorClick(rect.left+Pos2.x,rect.top+Pos2.y)
      flag = 3
    elif not RGB[3] == 0xfff5f5f5 or not RGB[7] == 0xfff5f5f5:
      EmuCursorClick(rect.left+Pos3.x,rect.top+Pos3.y)
      flag = 4
    cot = 0
    if flag == 0:
      quit=True
    elif flag == 1:
      RGB0 = DllGetPixel(wHWND,Pos0.x,Pos0.y) & 0xffffffff
      while not RGB0 == 0xfff5f5f5:
        time.sleep(0.05)
        cot += 1
        if cot > 20:
          quit=True
          break        
        RGB0 = DllGetPixel(wHWND,Pos0.x,Pos0.y) & 0xffffffff
    elif flag == 2:    
      RGB1 = DllGetPixel(wHWND,Pos1.x,Pos1.y) & 0xffffffff
      while not RGB1 == 0xfff5f5f5:
          break
        RGB1 = DllGetPixel(wHWND,Pos1.x,Pos1.y) & 0xffffffff
    elif flag == 3:
      RGB2 = DllGetPixel(wHWND,Pos2.x,Pos2.y) & 0xffffffff
      while not RGB2 == 0xfff5f5f5:
        RGB2 = DllGetPixel(wHWND,Pos2.x,Pos2.y) & 0xffffffff
    elif flag == 4:
      RGB3 = DllGetPixel(wHWND,Pos3.x,Pos3.y) & 0xffffffff
      while not RGB3 == 0xfff5f5f5:
        RGB3 = DllGetPixel(wHWND,Pos3.x,Pos3.y) & 0xffffffff  
  print 'end'

ctypes模块基础与注意事项

ctypes 模块基础教程

注意:本教程中的示例代码均经过 doctest 测试,以确保其正确运行。由于部分代码在 Linux、Windows 或 Mac OS X 系统下的行为存在差异,相关指令注解已包含在 doctest 中。

注意:部分示例代码引用了 ctypes 的 c_int 类型。在 sizeof(long) 等于 sizeof(int) 的平台上,该类型是 c_long 的别名。因此,当程序输出 c_long 而非预期的 c_int 时,无需困惑,二者实质为同一类型。

动态连接库的加载协议

载入动态连接库 ctypes 导出了 cdll 对象,在 Windows 系统中还额外提供了 windll 和 oledll 对象,用于加载动态连接库。

通过操作这些对象的属性,可以加载外部动态链接库。cdll 用于加载按标准 cdecl 调用协议导出的函数,而 windll 用于加载按 stdcall 调用协议调用的函数。oledll 同样按 stdcall 协议调用函数,并假设函数返回 Windows HRESULT 错误代码;当函数调用失败时,它会根据该代码自动抛出 OSError 异常。

在 3.3 版中进行了更改:原来在 Windows 下抛出的异常类型 WindowsError 现在是 OSError 的一个别名。

以下是 Windows 系统下的示例。注意:msvcrt 是微软 C 标准库,包含了大部分以 cdecl 调用协议调用的 C 标准函数。


>>> from ctypes import *
>>> print(windll.kernel32) 
<WinDLL 'kernel32', handle ... at ...>
>>> print(cdll.msvcrt)   
<CDLL 'msvcrt', handle ... at ...>
>>> libc = cdll.msvcrt   
>>>

Windows 系统会自动添加常见的 .dll 文件扩展名。

至此,关于Python中使用ctypes模拟点击的实例讲解已完成。如需了解更多Python通过ctypes模拟点击的相关内容,建议搜索本站历史文章或继续浏览后续文章。感谢大家的支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。