python 에서 spy++의 사용 초 상세 튜 토리 얼

11887 단어 pythonspy++쓰다
1.spy+의 기본 동작
spy++다운로드:
Microsoft Spy+V 15.0.26724.1 간 체 중국어 녹색 버 전 64 비트
在这里插入图片描述  
1.1 창 속성 찾기
在这里插入图片描述
중간 에 있 는'도구 찾기'를 끌 고 위치 추적 소프트웨어 에 올 려 놓 고 놓 으 세 요.
在这里插入图片描述
위 챗 을 예 로 들 면 우 리 는'위 챗'이라는 창의 핸들 을 얻 을 수 있 습 니 다.'00031510'입 니 다.이 핸들 은'16 진법',즉'0x 31510'입 니 다.
在这里插入图片描述
ok 를 누 르 면 더 자세 한 속성 정 보 를 볼 수 있 습 니 다.
在这里插入图片描述  
1.2 창 spy+위치 지정
在这里插入图片描述
같은 이치 로'위 챗'에 끌 어 다 놓 고'위 챗'의 인터페이스 를 얻 습 니 다.
在这里插入图片描述
ok 을 누 르 면'위 챗'으로 바로 찾 습 니 다.
在这里插入图片描述
여기 서 저 희 는 00031510'위 챗'WeChat MainWNForPC 라 는 메 시 지 를 볼 수 있 습 니 다.
C 00031510:16 진 을 대표 하 는 창 핸들
C 위 챗:대표 창 제목
C WeChatMainWNForPC:창 을 대표 하 는 클래스 이름
2,python 결합 spy+
필요 한 라 이브 러 리 가 져 오기

import win32con
from win32 import win32gui
from win32 import win32clipboard as w
import pyautogui
import sys
2.1 창 모든 속성 가 져 오기

def show_window_attr(hwnd):
 """
        
 :param hwnd:     (   )
 :return:      
 WindowName:     
 ClassName:     
 HwndPy:     (   )
 HwndSpy:     (    )
 """
 if not hwnd:
 return
 WindowName = win32gui.GetWindowText(hwnd)
 ClassName = win32gui.GetClassName(hwnd)
 HwndPy = hwnd
 HwndSpy = hex(hwnd)
 return (WindowName, ClassName, HwndPy, HwndSpy)
"위 챗"16 진법 의 창 핸들 을 알 고 있 습 니 다.먼저 10 진법 으로 전환 하면 모든 속성 을 가 져 올 수 있 습 니 다.

>>> int(0x31510)
202000
>>> show_window_attr(202000)
('  ', 'WeChatMainWndForPC', 202000, '0x31510')
2.2 모든 최상 위 창 가 져 오기

def show_top_windows():
 """
             
 :return:             
 """
 hwndList = []
 win32gui.EnumWindows(lambda hwnd, param: param.append(show_window_attr(hwnd)), hwndList)
 return hwndList
전체 데스크 톱 의 모든 창 을 가 져 옵 니 다.
在这里插入图片描述

>>> show_top_windows()
[('CClipboardThread', 'CClipboardThread', 2165890, '0x210c82'), ('G', 'GDI+ Hook Window Class', 463410, '0x71232'), ('', 'ForegroundStaging', 66338, '0x10322'), ('', 'ForegroundStaging', 66294, '0x102f6'), ('', 'tooltips_class32', 66234, '0x102ba'), ('', 'tooltips_class32', 66204, '0x1029c'), ('', 'tooltips_class32', 66200, '0x10298'), ('', 'tooltips_class32', 66196, '0x10294'), ('', 'tooltips_class32', 66192, '0x10290'), ('', 'tooltips_class32', 66174, '0x1027e'), ('', 'tooltips_class32', 66166, '0x10276'), ('', 'tooltips_class32', 66154, '0x1026a'), ('', 'tooltips_class32', 66888, '0x10548'), ('', 'tooltips_class32', 131762, '0x202b2'), ('', 'Q360NetmonClass', 197502, '0x3037e'), ('', 'tooltips_class32', 66208, '0x102a0'), ('', 'tooltips_class32', 11404742, '0xae05c6'), ('', 'tooltips_class32', 66214, '0x102a6'), ('', 'tooltips_class32', 66228, '0x102b4'), ('', 'tooltips_class32', 66222, '0x102ae'), 
2.3 모호 찾기 메 인 창

def FindFuzzyTopWindow(FuzzyWindowName=None):
 """
                   
 :param FuzzyWindowName:         
 :return:
 """
 all_windows = show_top_windows()
 result = []
 for window in all_windows:
 if FuzzyWindowName in window[0]:
 result.append(window)
 return result
  • 가끔 우 리 는'부분 이름'을 통 해 메 인 창의 속성 을 찾 아야 한다.
  • 창문 제목 에'동화 순'이 함 유 된 모든 창문
  • 을 찾 아 냈 다.
    
    >>> FindFuzzyTopWindow(FuzzyWindowName='   ')
    [('   (v8.80.80) -     ', 'Afx:400000:b:10003:6:d60ca7',
     134184, '0x20c28'), ('      ', '#32770', 462652, '0x70f3c')]
    2.4 대상 부모 창 아래 의 모든 하위 창 가 져 오기
    
    def FindSubHandles(pHandle=None, ClassName=None, WinName=None, index=None):
     """
                ,         
     :param pHandle:     (   )
     :param ClassName:     ,      
     :param WinName:     ,      
     :param index:   ,         
     :return:           
     """
     num = 0
     handle = 0
     SubHandlesList = []
     while True:
     # find next handle, return HwndPy
     handle = win32gui.FindWindowEx(pHandle, handle, ClassName, WinName) 
     if handle == 0:
     # no more handle
     break
     # get handle attribution
     attr = show_window_attr(handle)
     # append to list
     SubHandlesList.append(tuple(list(attr) + [num]))
     num += 1
     if index is not None:
     return SubHandlesList[index]
     else:
     return SubHandlesList
  • 방금'동화 순'을 예 로 들 면 십 진법 핸들 은 134184
  • 이다
  • 기타 매개 변 수 는 특정 상황 에서 작용 할 수 있 습 니 다
  • 
    >>> FindSubHandles(pHandle=134184)
    [('', 'Button', 69090, '0x10de2', 0), 
    ('', 'ToolbarWindow32', 69272, '0x10e98', 1),
     ('', 'msctls_statusbar32', 265490, '0x40d12', 2), 
     ('', 'msctls_statusbar32', 134664, '0x20e08', 3), 
     ('', 'AfxFrameOrView42s', 134212, '0x20c44', 4), 
     ('', 'AfxControlBar42s', 134180, '0x20c24', 5), 
     ('', 'AfxControlBar42s', 134192, '0x20c30', 6), 
     ('   ', 'AfxControlBar42s', 134194, '0x20c32', 7),
     ('', 'AfxControlBar42s', 134196, '0x20c34', 8), 
     ('HqEmbededTradeContainer', 'Afx:400000:0', 69270, '0x10e96', 9), 
     ('   ', 'Afx:400000:8:10003:10006e:0', 69320, '0x10ec8', 10), 
     ('', 'Afx:400000:0', 69430, '0x10f36', 11), 
     ('', 'Afx:400000:0', 69432, '0x10f38', 12)]
    SPY++의 결과 와 완전히 일치 합 니 다.
    在这里插入图片描述  
    2.5 부모 창 가 져 오기
    아래 의 모든 하위 창 은 모든 창 을 옮 겨 다 니 며 모든 계층 의 하위 창 을 가 져 옵 니 다.
    
    def ShowAllHandle(pHandle=None, HandleList=[[None]], HandleDict=dict()):
     """
                
     :param pHandle:      
     :param HandleList:    [[None]]
     :param HandleDict:         
     :return:                 
     """
     sys.setrecursionlimit(1000000)
     if pHandle:
     HandleList[-1][0] = pHandle
     handles = FindSubHandles(HandleList[-1][0][2])
     else:
     handles = FindSubHandles()
     for handle in handles:
     HandleDict[handle] = pHandle
     #           ,  
     del HandleList[-1][0]
     #       ,  ,        
     if handles:
     HandleList.append(handles)
     #         
     HandleList = [HandleGroup for HandleGroup in HandleList if HandleGroup]
     #           ,     
     if HandleList:
     return ShowAllHandle(pHandle=HandleList[-1][0], HandleList=HandleList, HandleDict=HandleDict)
     else:
     return HandleDict
    
    pHandle:이 매개 변 수 는
    
    ('   (v8.80.80) -     ', 'Afx:400000:b:10003:6:d60ca7', 134184, '0x20c28')
    호출 함수
    
    ShowAllHandle(FindFuzzyTopWindow(FuzzyWindowName='   ')[0])
    모든 대응 관계 의 사전 을 얻다
    在这里插入图片描述  
    2.6 특정 창의 경 로 를 찾 습 니 다.
    핸들 이 서로 다른 컴퓨터 에서 의 결과 가 다 르 기 때문에 우 리 는 이 유일한 길 을 찾 아야 한다.
    
    def FindHandlePath(TargetHandle, num):
     """
                
     :param TargetHandle:     (    )
     :param num:     index, spy++   
     :return:
     ParentWindow:    
     TargetPath:   index
     """
     AllPath = ShowAllHandle(pHandle=None, HandleList=[[None]], HandleDict=dict())
     key = tuple(list(show_window_attr(int(TargetHandle))) + [num])
     handlepath = [key]
     while True:
     key = AllPath[key]
     if not key:
     handlepath = handlepath[::-1]
     ParentWindow = handlepath[0]
     TargetPath = [(i[-1]) for i in handlepath[1:]]
     return ParentWindow, TargetPath
     handlepath.append(key)
  • 논 리 는 모든 등급 의 대응 관 계 를 찾 은 다음 에
  • 을 역방향 으로 검색 하 는 것 이다.
  • '동화 순'의'매입'버튼 의 경우 SPY++를 통 해
  • 찾기
    在这里插入图片描述
    우 리 는 16 진 핸들 을'0x40D 98'로 얻 었 고,동시에 index 는 6 이다.
    在这里插入图片描述
  • TargetHandle=0x40D98, num=6
  • 획득 경 로 는 다음 과 같 습 니 다
  • 
    >>> FindHandlePath(TargetHandle=0x40D98, num=6)
    (('   (v8.80.80) -     ', 'Afx:400000:b:10003:6:d60ca7', 134184, '0x20c28', 308), 
    [5, 0, 6])
  • 메 인 창문:동화 순(v 8.8.0.80)-나의 지각 판
  • 5:여섯 번 째 창문
  • 0:첫 번 째 창문
  • 6:일곱 번 째 창문
  • 2.7 경로 에 따라 특정한 창의 핸들 을 찾 습 니 다.
    
    def FindTargetHandle(pHandle, WindowList):
     """
               
     :param pHandle:           (WindowName, ClassName, HwndPy, HwndSpy)
     :param WindowList:      
     :return:          
     """
     for i in range(len(WindowList)):
     pHandle = FindSubHandles(pHandle[2], index=WindowList[i])
     return pHandle
  • 지금
  • 우 리 는 이미 어떤 창의 검색 경 로 를 가지 고 있 습 니 다.상기 함 수 를 통 해 핸들 을 찾 습 니 다.우리 의 경 로 는 ((' (v8.80.80) - ', 'Afx:400000:b:10003:6:d60ca7', 134184, '0x20c28', 308), [5, 0, 6])
  • 입 니 다.
  • 호출 함수
  • 
    >>> FindTargetHandle(('   (v8.80.80) -     ', 'Afx:400000:b:10003:6:d60ca7', 134184, '0x20c28', 308), [5, 0, 6])
    ('', 'Button', 265624, '0x40d98', 6)
  • 'Button'이라는 창 을 얻 었 습 니 다.
  • .
  • 은 우리 가 방금 한 결 과 를 비교 하면 정확 하 다.
  •  2.8 핸들 에 따라 창 을 찾 습 니 다.
  • 이 단추 의 10 진 핸들 은 265624
  • 입 니 다.
  • 호출 함수 GetWindowRect
  • 
    >>> x,y,m,n = win32gui.GetWindowRect(265624)
    >>> pyautogui.moveTo((x+m)/2, (y+n)/2)
    이때 마 우 스 는 자동 으로 이 창 으로 이동 합 니 다.
    참조 링크:
    https://blog.csdn.net/qq_25408423/article/details/80884114
    https://blog.csdn.net/seele52/article/details/17504925
    python 에서 spy++를 사용 하 는 초 상세 튜 토리 얼 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 python 에서 spy+사용 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기