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中的defaultdict模块和namedtuple模块的简单入门指南
Apr 01 Python
python的keyword模块用法实例分析
Jun 30 Python
深入理解Python中range和xrange的区别
Nov 26 Python
Python实现从log日志中提取ip的方法【正则提取】
Mar 31 Python
Python实现的读取/更改/写入xml文件操作示例
Aug 30 Python
python分批定量读取文件内容,输出到不同文件中的方法
Dec 08 Python
对python 中class与变量的使用方法详解
Jun 26 Python
pandas计算最大连续间隔的方法
Jul 04 Python
python返回数组的索引实例
Nov 28 Python
pytorch实现focal loss的两种方式小结
Jan 02 Python
python 实现百度网盘非会员上传超过500个文件的方法
Jan 07 Python
Python socket如何解析HTTP请求内容
Feb 12 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/03/24 PHP
php读取excel文件的简单实例
2013/08/26 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
PHP中的reflection反射机制测试例子
2014/08/05 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
2015/09/30 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
Laravel 队列使用的实现
2019/01/08 PHP
Using the TextRange Object
2006/10/14 Javascript
lib.utf.js
2007/08/21 Javascript
五段实用的js高级技巧
2011/12/20 Javascript
JQuery对表单元素的基本操作使用总结
2014/07/18 Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
2016/08/08 Javascript
node网页分段渲染详解
2016/09/05 Javascript
解析利用javascript如何判断一个数为素数
2016/12/08 Javascript
js实现文字无缝向上滚动
2017/02/16 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
layui type2 通过url给iframe子页面传值的例子
2019/09/06 Javascript
JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】
2020/05/23 Javascript
python使用BeautifulSoup分析网页信息的方法
2015/04/04 Python
Python使用urllib2模块抓取HTML页面资源的实例分享
2016/05/03 Python
Python实现返回数组中第i小元素的方法示例
2017/12/04 Python
Python实现对特定列表进行从小到大排序操作示例
2019/02/11 Python
Django框架搭建的简易图书信息网站案例
2019/05/25 Python
利用pytorch实现对CIFAR-10数据集的分类
2020/01/14 Python
python如何删除文件、目录
2020/06/23 Python
Python实现异步IO的示例
2020/11/05 Python
神经网络训练采用gpu设置的方式
2021/03/03 Python
NHL官方在线商店:Shop.NHL.com
2020/05/01 全球购物
Yahoo-PHP面试题3
2012/01/14 面试题
幼教毕业生自我鉴定
2014/01/12 职场文书
心理学专业大学生职业生涯规划范文
2014/02/19 职场文书
承诺书格式范文
2014/06/03 职场文书
验房委托书
2014/08/30 职场文书
医院保洁员管理制度
2015/08/05 职场文书
详解CSS中postion和opacity及cursor的特性
2022/08/14 HTML / CSS