python에서 ctypes로 클릭을 시뮬레이션하는 실례 설명

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_롱의 별명그래서 프로그램에서 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로 아날로그 클릭 내용을 아날로그 클릭했는지 저희의 이전 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기