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查看微信好友是否删除自己
Dec 19 Python
Python Socket传输文件示例
Jan 16 Python
python 查找字符串是否存在实例详解
Jan 20 Python
Django中redis的使用方法(包括安装、配置、启动)
Feb 21 Python
Django实现全文检索的方法(支持中文)
May 14 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
Jun 28 Python
Python CSV文件模块的使用案例分析
Dec 21 Python
Python模块的定义,模块的导入,__name__用法实例分析
Jan 07 Python
python爬虫基础知识点整理
Jun 02 Python
详解Python多线程下的list
Jul 03 Python
Python模块zipfile原理及使用方法详解
Aug 04 Python
python基础之类方法和静态方法
Oct 24 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
3种平台下安装php4经验点滴
2006/10/09 PHP
php select,radio和checkbox默认选择的实现方法
2010/05/15 PHP
PHP原理之异常机制深入分析
2010/08/08 PHP
WordPress中对访客评论功能的一些优化方法
2015/11/24 PHP
Yii框架实现的验证码、登录及退出功能示例
2017/05/20 PHP
网页常用特效代码整理
2006/06/23 Javascript
JavaScript中Array 对象相关的几个方法
2006/12/22 Javascript
img标签中onerror用法
2009/08/13 Javascript
JavaScript实现twitter puddles算法实例
2014/12/06 Javascript
jquery搜索框效果实现方法
2015/01/16 Javascript
JQuery select(下拉框)操作方法汇总
2015/04/15 Javascript
gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
2016/02/21 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
AngularJS入门教程之路由与多视图详解
2016/08/19 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
JS实现简单的表格增删
2020/01/16 Javascript
JavaScript如何判断对象有某属性
2020/07/03 Javascript
Python批处理更改文件名os.rename的方法
2018/10/26 Python
python判断文件是否存在,不存在就创建一个的实例
2019/02/18 Python
Python Web框架之Django框架cookie和session用法分析
2019/08/16 Python
Django REST 异常处理详解
2020/07/15 Python
利用css3画个同心圆示例代码
2017/07/03 HTML / CSS
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
The North Face北面美国官网:美国著名户外品牌
2018/09/15 全球购物
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
Ever New美国:澳大利亚领先的女装时尚品牌
2019/11/28 全球购物
函数只定义了一次, 调用了一次, 但编译器提示非法重定义了-什么问题?
2014/10/03 面试题
大学生职业生涯规划书模板
2014/01/18 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
好好学习保证书
2015/02/26 职场文书
2015年部门工作总结范文
2015/03/31 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
部门2015年度工作总结
2015/04/29 职场文书
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python
忘记Grafana不要紧2种Grafana重置admin密码方法详细步骤
2022/04/07 Servers