python中用ctypes模拟点击的实例讲解
在小编学习python中的模拟点击之前,我们想要对某一项操作进行自动指令的重复,可以选择大家熟知的按键精灵。那么对比python的模拟点击,小编还是觉得python中使用更加方便。这样说不能让有些小伙伴信服,下面小编就以一个以小游戏为例,在我们写完ctypes模拟点击后用python运行,看看游戏体验效果。
按键精灵提供的窗口api性能并不算的上太好。但是将整个逻辑搬到python上,并提供了自己所写的api后,速度有了很大的提升。
直接用python调用,获取特定点位置上的颜色,非白色就发送点击指令。然后循环等待下一个黑色块的到来。同时设定定时时间,若长时间依旧是这个颜色,证明游戏结束,直接退出。代码如下:
WindowFunction=ctypes.windll.LoadLibrary("E:\\PythonHack\\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
whilenotquit:
DllGetMultiPixel(wHWND,byref(cMulti),byref(RGB))
flag=0
ifnotRGB[0]==0xfff5f5f5ornotRGB[4]==0xfff5f5f5:
EmuCursorClick(rect.left+Pos0.x,rect.top+Pos0.y)
flag=1
elifnotRGB[1]==0xfff5f5f5ornotRGB[5]==0xfff5f5f5:
EmuCursorClick(rect.left+Pos1.x,rect.top+Pos1.y)
flag=2
elifnotRGB[2]==0xfff5f5f5ornotRGB[6]==0xfff5f5f5:
EmuCursorClick(rect.left+Pos2.x,rect.top+Pos2.y)
flag=3
elifnotRGB[3]==0xfff5f5f5ornotRGB[7]==0xfff5f5f5:
EmuCursorClick(rect.left+Pos3.x,rect.top+Pos3.y)
flag=4
cot=0
ifflag==0:
quit=True
elifflag==1:
RGB0=DllGetPixel(wHWND,Pos0.x,Pos0.y)&0xffffffff
whilenotRGB0==0xfff5f5f5:
time.sleep(0.05)
cot+=1
ifcot>20:
quit=True
break
RGB0=DllGetPixel(wHWND,Pos0.x,Pos0.y)&0xffffffff
elifflag==2:
RGB1=DllGetPixel(wHWND,Pos1.x,Pos1.y)&0xffffffff
whilenotRGB1==0xfff5f5f5:
break
RGB1=DllGetPixel(wHWND,Pos1.x,Pos1.y)&0xffffffff
elifflag==3:
RGB2=DllGetPixel(wHWND,Pos2.x,Pos2.y)&0xffffffff
whilenotRGB2==0xfff5f5f5:
RGB2=DllGetPixel(wHWND,Pos2.x,Pos2.y)&0xffffffff
elifflag==4:
RGB3=DllGetPixel(wHWND,Pos3.x,Pos3.y)&0xffffffff
whilenotRGB3==0xfff5f5f5:
RGB3=DllGetPixel(wHWND,Pos3.x,Pos3.y)&0xffffffff
print'end'
ctypes教程
注意:在本教程中的示例代码使用doctest进行过测试,保证其正确运行。由于有些代码在Linux,Windows或MacOSX下的表现不同,这些代码会在doctest中包含相关的指令注解。
注意:部分示例代码引用了ctypesc_int类型。在sizeof(long)==sizeof(int)的平台上此类型是c_long的一个别名。所以,在程序输出c_long而不是你期望的c_int时不必感到迷惑---它们实际上是同一种类型。
载入动态连接库
ctypes导出了cdll对象,在Windows系统中还导出了windll和oledll对象用于载入动态连接库。
通过操作这些对象的属性,你可以载入外部的动态链接库。cdll载入按标准的cdecl调用协议导出的函数,而windll导入的库按stdcall调用协议调用其中的函数。oledll也按stdcall调用协议调用其中的函数,并假定该函数返回的是WindowsHRESULT错误代码,并当函数调用失败时,自动根据该代码甩出一个OSError异常。
在3.3版更改:原来在Windows下甩出的异常类型WindowsError现在是OSError的一个别名。
这是一些Windows下的例子。注意:msvcrt是微软C标准库,包含了大部分C标准函数,这些函数都是以cdecl调用协议进行调用的。
>>>fromctypesimport* >>>print(windll.kernel32)>>>print(cdll.msvcrt) >>>libc=cdll.msvcrt >>>
Windows会自动添加通常的.dll文件扩展名。
到此这篇关于python中用ctypes模拟点击的实例讲解的文章就介绍到这了,更多相关python中如何用ctypes模拟点击内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!