python中用ctypes模拟点击的实例讲解


Posted in Python onNovember 26, 2020

在小编学习python中的模拟点击之前,我们想要对某一项操作进行自动指令的重复,可以选择大家熟知的按键精灵。那么对比python的模拟点击,小编还是觉得python中使用更加方便。这样说不能让有些小伙伴信服,下面小编就以一个以小游戏为例,在我们写完ctypes模拟点击后用python运行,看看游戏体验效果。

按键精灵提供的窗口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 教程

注意:在本教程中的示例代码使用 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 标准库,包含了大部分 C 标准函数,这些函数都是以 cdecl 调用协议进行调用的。

>>> 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 相关文章推荐
利用Python脚本生成sitemap.xml的实现方法
Jan 31 Python
Python实现随机生成有效手机号码及身份证功能示例
Jun 05 Python
基于循环神经网络(RNN)的古诗生成器
Mar 26 Python
PHP实现发送和接收JSON请求
Jun 07 Python
win8下python3.4安装和环境配置图文教程
Jul 31 Python
python动态进度条的实现代码
Jul 03 Python
python 绘制拟合曲线并加指定点标识的实现
Jul 10 Python
Django 对IP访问频率进行限制的例子
Aug 30 Python
python飞机大战pygame游戏框架搭建操作详解
Dec 17 Python
在Python中利用pickle保存变量的实例
Dec 30 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
Mar 10 Python
如何在scrapy中捕获并处理各种异常
Sep 28 Python
python爬虫分布式获取数据的实例方法
Nov 26 #Python
python分布式爬虫中消息队列知识点详解
Nov 26 #Python
Flask-SocketIO服务端安装及使用代码示例
Nov 26 #Python
使用OpenCV校准鱼眼镜头的方法
Nov 26 #Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
Nov 26 #Python
Django-celery-beat动态添加周期性任务实现过程解析
Nov 26 #Python
Django celery异步任务实现代码示例
Nov 26 #Python
You might like
PHP编实现程动态图像的创建代码
2008/09/28 PHP
PHP nl2br函数 将换行字符转成 &amp;lt;br&amp;gt;
2009/08/21 PHP
php连接数据库代码应用分析
2011/05/29 PHP
php使用wordwrap格式化文本段落的方法
2015/03/17 PHP
PHP创建对象的六种方式实例总结
2019/06/27 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
用jquery模仿的a的title属性(兼容ie6/7)
2013/01/21 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
浅谈jQuery中setInterval()方法
2015/07/07 Javascript
javascript下拉列表中显示树形菜单的实现方法
2015/11/17 Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
2016/10/29 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
vue webpack打包优化操作技巧
2018/02/22 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
python 字符串格式化代码
2013/03/17 Python
Python扫描IP段查看指定端口是否开放的方法
2015/06/09 Python
PyTorch的深度学习入门教程之构建神经网络
2019/06/27 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
python爬虫今日热榜数据到txt文件的源码
2021/02/23 Python
使用CSS3创建动态菜单效果
2015/07/10 HTML / CSS
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
Contém1g官网:巴西彩妆品牌
2020/01/17 全球购物
大学生学习党课思想汇报
2014/01/03 职场文书
新书吧创业计划书
2014/01/31 职场文书
喷漆工的岗位职责
2014/03/17 职场文书
销售简历自我评价怎么写
2014/09/26 职场文书
2014年体育部工作总结
2014/11/13 职场文书
捐助倡议书
2015/01/19 职场文书
道歉的话语大全
2015/05/12 职场文书
mysql中between的边界,范围说明
2021/06/08 MySQL
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers