python 에서 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
>>> 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)
우 리 는 16 진 핸들 을'0x40D 98'로 얻 었 고,동시에 index 는 6 이다.
>>> FindHandlePath(TargetHandle=0x40D98, num=6)
((' (v8.80.80) - ', 'Afx:400000:b:10003:6:d60ca7', 134184, '0x20c28', 308),
[5, 0, 6])
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)
>>> 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+사용 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.