python中用ctypes模擬點擊的實例講解
在小編學(xué)習(xí)python中的模擬點擊之前,我們想要對某一項操作進行自動指令的重復(fù),可以選擇大家熟知的按鍵精靈。那么對比python的模擬點擊,小編還是覺得python中使用更加方便。這樣說不能讓有些小伙伴信服,下面小編就以一個以小游戲為例,在我們寫完ctypes模擬點擊后用python運行,看看游戲體驗效果。
按鍵精靈提供的窗口api性能并不算的上太好。但是將整個邏輯搬到python上,并提供了自己所寫的api后,速度有了很大的提升。
直接用python調(diào)用,獲取特定點位置上的顏色,非白色就發(fā)送點擊指令。然后循環(huán)等待下一個黑色塊的到來。同時設(shè)定定時時間,若長時間依舊是這個顏色,證明游戲結(jié)束,直接退出。代碼如下:
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下的表現(xiàn)不同,這些代碼會在 doctest 中包含相關(guān)的指令注解。
注意:部分示例代碼引用了 ctypes c_int 類型。在 sizeof(long) == sizeof(int) 的平臺上此類型是 c_long 的一個別名。所以,在程序輸出 c_long 而不是你期望的 c_int 時不必感到迷惑 --- 它們實際上是同一種類型。
載入動態(tài)連接庫
ctypes 導(dǎo)出了 cdll 對象,在 Windows 系統(tǒng)中還導(dǎo)出了 windll 和 oledll 對象用于載入動態(tài)連接庫。
通過操作這些對象的屬性,你可以載入外部的動態(tài)鏈接庫。cdll 載入按標準的 cdecl 調(diào)用協(xié)議導(dǎo)出的函數(shù),而 windll 導(dǎo)入的庫按 stdcall 調(diào)用協(xié)議調(diào)用其中的函數(shù)。 oledll 也按 stdcall 調(diào)用協(xié)議調(diào)用其中的函數(shù),并假定該函數(shù)返回的是 Windows HRESULT 錯誤代碼,并當函數(shù)調(diào)用失敗時,自動根據(jù)該代碼甩出一個 OSError 異常。
在 3.3 版更改: 原來在 Windows 下甩出的異常類型 WindowsError 現(xiàn)在是 OSError 的一個別名。
這是一些 Windows 下的例子。注意:msvcrt 是微軟 C 標準庫,包含了大部分 C 標準函數(shù),這些函數(shù)都是以 cdecl 調(diào)用協(xié)議進行調(diào)用的。
>>> from ctypes import * >>> print(windll.kernel32) <WinDLL 'kernel32', handle ... at ...> >>> print(cdll.msvcrt) <CDLL 'msvcrt', handle ... at ...> >>> libc = cdll.msvcrt >>>
Windows會自動添加通常的 .dll 文件擴展名。
到此這篇關(guān)于python中用ctypes模擬點擊的實例講解的文章就介紹到這了,更多相關(guān)python中如何用ctypes模擬點擊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決使用OpenCV中的imread()內(nèi)存報錯問題
這篇文章主要介紹了解決使用OpenCV中的imread()內(nèi)存報錯問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03Python中NumPy的線性代數(shù)子模塊linalg詳解
這篇文章主要介紹了Python中NumPy的線性代數(shù)子模塊linalg詳解,NumPy 的線性代數(shù)子模塊linalg提供了 20 余個函數(shù),用于求解行列式、逆矩陣、特征值、特征向量,以及矩陣分解等,需要的朋友可以參考下2023-08-08PyQt5下拉式復(fù)選框QComboCheckBox的實例
今天小編就為大家分享一篇PyQt5下拉式復(fù)選框QComboCheckBox的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06python GUI庫圖形界面開發(fā)之PyQt5輸入對話框QInputDialog詳細使用方法與實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5輸入對話框QInputDialog詳細使用方法與實例,需要的朋友可以參考下2020-02-02基于python實現(xiàn)模擬數(shù)據(jù)結(jié)構(gòu)模型
這篇文章主要介紹了基于python實現(xiàn)模擬數(shù)據(jù)結(jié)構(gòu)模型,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06如何利用python多線程爬取天氣網(wǎng)站圖片并保存
最近做個天 氣方面的APP需要用到一些天氣數(shù)據(jù),所以下面這篇文章主要給大家介紹了關(guān)于如何利用python多線程爬取天氣網(wǎng)站圖片并保存的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2021-11-11