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、Javascript中的闭包比较
Feb 04 Python
Python Requests 基础入门
Apr 07 Python
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
Jul 12 Python
Python中join函数简单代码示例
Jan 09 Python
python爬虫超时的处理的实例
Dec 19 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
使用Python opencv实现视频与图片的相互转换
Jul 08 Python
Python3 shelve对象持久存储原理详解
Mar 23 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
Apr 08 Python
Python如何实现定时器功能
May 28 Python
Python lxml库的简单介绍及基本使用讲解
Dec 22 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
Feb 06 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
fleaphp常用方法分页之Pager使用方法
2011/04/23 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
2016/05/20 PHP
javascript实现的动态文字变换
2007/07/28 Javascript
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
jquery 双色表格实现代码
2009/12/08 Javascript
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
对Jquery中的ajax再封装,简化操作示例
2014/02/12 Javascript
table insertRow、deleteRow定义和用法总结
2014/05/14 Javascript
Input文本框随着输入内容多少自动延伸的实现
2017/02/15 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
Java中重定向输出流实现用文件记录程序日志
2015/06/12 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
2018/02/08 Python
python如何停止递归
2020/09/09 Python
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
世界上最好的帽子:Tilley
2016/11/27 全球购物
全球性的在线婚纱礼服工厂:27dress.com
2019/03/21 全球购物
企业面试题试卷附带答案
2015/12/20 面试题
简历自荐信
2013/12/02 职场文书
技术学校毕业生求职信分享
2013/12/02 职场文书
小学后勤管理制度
2014/01/14 职场文书
自荐信格式简述
2014/01/25 职场文书
优秀教导主任事迹材料
2014/05/09 职场文书
经济贸易系毕业生求职信
2014/05/31 职场文书
安全宣传标语口号
2014/06/06 职场文书
财务工作疏忽检讨书
2014/09/11 职场文书
2015年元旦主持词开场白
2014/12/14 职场文书
银行优秀员工推荐信
2015/03/24 职场文书
台风停课通知
2015/04/24 职场文书
具结保证书范本
2015/05/11 职场文书
《风筝》教学反思
2016/02/23 职场文书
WIN10使用IIS部署ftp服务器详细教程
2022/08/05 Servers
HTML中link标签属性的具体用法
2023/05/07 HTML / CSS