python에서 ctypes로 클릭을 시뮬레이션하는 실례 설명
버튼 정령이 제공하는 창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_롱의 별명그래서 프로그램에서 c_ 출력하기long 네가 바라는 c_int를 할 때 미혹될 필요가 없습니다. - 그것들은 실제로 같은 유형입니다.
동적 연결 라이브러리 로드
ctypes에서 cdll 대상을 내보냈고 Windows 시스템에서 windll과oledll 대상을 동적 연결 라이브러리에 불러오는 데 사용했습니다.
이 대상의 속성을 조작하면 외부의 동적 링크 라이브러리를 불러올 수 있습니다.cdll은 표준 cdecl 호출 프로토콜에 따라 내보낸 함수를 불러오고, windll이 가져온 라이브러리는 stdcall 호출 프로토콜에 따라 그 함수를 호출합니다.oledll도 stdcall 호출 프로토콜에 따라 그 함수를 호출합니다. 이 함수는 Windows HRESULT 오류 코드로 되돌아오고 함수 호출이 실패하면 자동으로 이 코드에 따라 OSError 이상이 발생합니다.
버전 3.3에서 변경: 원래 Windows에서 차버린 이상 유형 Windows Error는 현재 OS Error의 별명입니다.
이것은 일부 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로 아날로그 클릭 내용을 아날로그 클릭했는지 저희의 이전 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.