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 列表(List)操作方法详解
Mar 11 Python
在Docker上部署Python的Flask框架的教程
Apr 08 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
Apr 24 Python
django使用haystack调用Elasticsearch实现索引搜索
Jul 24 Python
python中append实例用法总结
Jul 30 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
Sep 20 Python
python使用itchat模块给心爱的人每天发天气预报
Nov 25 Python
Python函数__new__及__init__作用及区别解析
Aug 31 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
Nov 26 Python
利用python进行文件操作
Dec 04 Python
利用Python第三方库实现预测NBA比赛结果
Jun 21 Python
分享几种python 变量合并方法
Mar 20 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记录日志的实现代码
2011/08/08 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
php通过curl模拟登陆DZ论坛
2015/05/11 PHP
PHP使用Pthread实现的多线程操作实例
2015/11/14 PHP
PHP无限极分类函数的实现方法详解
2017/04/15 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
window.name代替cookie的实现代码
2010/11/28 Javascript
js保存当前路径(cookies记录)
2010/12/14 Javascript
使用javascript实现页面定时跳转总结篇
2013/09/21 Javascript
php析构函数的具体用法小结
2014/03/11 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
基于jquery实现的仿优酷图片轮播特效代码
2016/01/13 Javascript
详解JavaScript权威指南之对象
2016/09/27 Javascript
js实现鼠标跟随运动效果
2020/08/02 Javascript
mpvue小程序仿qq左滑置顶删除组件
2018/08/03 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
2018/08/30 Javascript
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
JS实现选项卡插件的两种写法(jQuery和class)
2020/12/30 jQuery
Python isinstance函数介绍
2015/04/14 Python
用PyQt进行Python图形界面的程序的开发的入门指引
2015/04/14 Python
Python正则表达式完全指南
2017/05/25 Python
python抓取网站的图片并下载到本地的方法
2018/05/22 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
2018/05/24 Python
PyQt QCombobox设置行高的方法
2019/06/20 Python
Django结合ajax进行页面实时更新的例子
2019/08/12 Python
python em算法的实现
2020/10/03 Python
python从ftp获取文件并下载到本地
2020/12/05 Python
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
工商学院毕业生自荐信
2013/11/12 职场文书
集团公司人力资源部岗位职责
2014/01/03 职场文书
读书活动实施方案
2014/03/10 职场文书
企业职业病防治方案
2014/05/29 职场文书
2014年小学校长工作总结
2014/12/08 职场文书
在JavaScript中如何使用宏详解
2021/05/06 Javascript