• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

python中spy++的使用超详细教程

python 搞代码 4年前 (2022-01-09) 29次浏览 已收录 0个评论
文章目录[隐藏]

1、spy++的基本操作

搞代码下载spy++:

拖住中间的“寻找工具”放到想要定位的软件上,然后松开

以微信为例,我们会得到“微信”这个窗口的句柄,为“00031510”,注意这个句柄是“十六进制”,即“0x31510”。

点击ok我们会看到更详细的属性信息

同理拖放到“微信”上,获取到“微信”的界面

点击ok,会直接定位到“微信”

在这里我们会看到一条信息00031510 “微信” WeChatMainWndForPC
? 00031510:代表十六进制的窗口句柄
? 微信:代表窗口标题
? WeChatMainWndForPC:代表窗口的类名


2、python结合spy++

导入必要的库

import wi<em style="color:transparent">本文来源gao.dai.ma.com搞@代*码#网</em>n32con
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)

已经知道“微信”十六进制的窗口句柄,先转化为十进制,可获取全部属性

>>> 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)]

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:python中spy++的使用超详细教程

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址