如何使己有的应用程序自动化 - 条件结构

张开发
2026/4/20 23:25:45 15 分钟阅读

分享文章

如何使己有的应用程序自动化 - 条件结构
要使应用程序具有自动化能力是否一定需要应用程序具有对象化和类的结构层次例如Excel,Word应用程序它们都要对象层次结构可以用VBA,Python来实现自动化。核心疑问应用程序要具备自动化能力是否一定需要它本身具有对象化和类的结构层次以Excel/Word为例认为它们有对象层次结构所以VBA/Python能自动化。想知道这是否是必要条件。需要从自动化实现的原理出发解释对象层次结构不是必要条件而是特定自动化方式的特征。自动化可以通过多种机制实现对象模型/API、UI自动化、图像识别、消息钩子等。然后以Excel/Word为例说明其对象模型是如何支持自动化的同时对比没有暴露对象模型的程序如老旧桌面软件是如何通过其他方式实现自动化的。结合案例深入解析工作原理、机制、组织结构。可以从“自动化是如何与控制程序交互”的角度分层阐述。你的这个问题触及了应用程序自动化机制的一个核心区分点。简短回答是不需要。一个应用程序不必具有对象化或类的结构层次也能被自动化。Excel、Word 有清晰的“Application → Workbook → Worksheet → Range”对象层次这只是一种最优雅、最稳定的自动化路径。但自动化还有“野路子”——通过对用户界面的模拟操作。下面我把这两种机制彻底拆开用对照的方式让你看清“有层次结构”和“没有层次结构”时自动化是如何工作的。第一类有对象层次结构的程序以 Excel 为例这就是你提到的 Excel、Word 模式。专业术语叫“通过 API 或 COM 接口暴露对象模型”。1. 工作原理开“后门”的对话机制这种自动化本质上是程序 A你的代码与程序 BExcel在内存中进行“结构性对话”。Excel 做了什么它在启动时会向 Windows 操作系统注册一个接口COM 接口。这个接口相当于 Excel 的“内部语音助手”。你的代码做了什么你的 VBA 或 Python 代码通过连接这个接口对 Excel 发出精确的结构化指令。你的 Python 代码说 Workbooks[1].Sheets[1].Cells[1,1].Value 100 Excel 内部编译器理解 我知道 Workbook 对象是哪个内存地址我知道 Sheet1 在 XML 里的索引修改那个格子的数据流。 Excel 返回 Done.2. 为什么必须有层次结构在这种模式下对象层次是语法规则也是内存寻址地图。Application是入口大本营。Workbook是文件容器。Worksheet是数据页。Range是具体的坐标。没有这个层次你的代码就无法描述“在这个文件里的这个表里的这个格子”。这种自动化极其健壮因为它不依赖屏幕显示、不依赖鼠标光标位置。第二类没有对象层次结构的程序以某老旧财务软件为例假设一款 2005 年开发的财务软件开发者没有预留任何编程接口也没有 COM 对象。它只是一个.exe文件双击打开用鼠标点。它难道就不能自动化了吗——能用 RPA机器人流程自动化。1. 工作原理模拟人类的眼睛和手由于无法与程序内部对话自动化脚本只能通过操作系统层面去操控程序。眼睛图像识别脚本截取屏幕图片通过 OpenCV 算法在屏幕上搜索“确认按钮.png”的位置坐标。手鼠标/键盘钩子脚本调用 Windows API告诉系统“在坐标 (X350, Y420) 处模拟一次鼠标左键按下”。2. 对象层次在哪里——不在程序里在脚本自己建的“逻辑树”里这种自动化没有原生层次结构但程序员为了让代码不混乱会人工建立一个虚拟的层次结构。# 这是一个没有对象模型的程序但我们用代码“强行”造出对象感class老旧财务软件:def__init__(self):self.主窗口窗口定位器(title财务系统 v1.0)self.菜单栏图像定位器(images/菜单栏.png)self.凭证录入区坐标定位器(x100,y200)def录入凭证(self,金额):self.主窗口.激活()# 模拟点击标题栏鼠标移动到(self.凭证录入区.x,self.凭证录入区.y).点击()键盘输入(str(金额))键盘按(Tab)结论程序本身是混沌的一坨像素但自动化脚本通过**截图、坐标、窗口句柄Handle**这三个要素在外部强行拼凑出了一个“类层次结构”。第三类深层机制对比表一图看懂核心差异对比维度有对象层次结构Excel / VBA无对象层次结构老软件 / RPA通信层级应用层内部COM / API 调用操作系统 GUI 层GDI / Win32 消息定位方式通过逻辑地址Sheet1.Range(A1)通过物理坐标X200, Y150或截图匹配容错率极高。Excel 最小化在后台、屏幕分辨率改变代码依然正常跑。极低。电脑弹出个 QQ 新闻窗挡住了按钮或者显示器分辨率变了脚本立刻崩溃。依赖条件必须安装该程序且开放接口不需要程序源码/接口只要是个能在 Windows 上运行的 .exe 就行第四类一个极端的“无层次”自动化案例为了让你彻底理解“没有层次也能自动化”想象一个极端场景场景有一台老式机床的配套软件界面极其诡异没有标题栏文字所有按钮都是画出来的图片无法通过技术手段抓取文字。如何自动化按下“开始加工”按钮条件要求必须有一张精确的开始按钮.bmp截图文件。实现机制脚本每隔 1 秒截一次屏幕。调用cv2.matchTemplate()在截图中扫描寻找相似度 95% 的区域。找到坐标 (425, 688)。调用pyautogui.click(425, 688)。组织结构完全没有 Excel 那种“Workbook-Sheet”的树状结构只有像素矩阵比对。最终解析Excel 的对象层次本质是什么回到你的疑惑。Excel、Word 之所以有那种漂亮的、像树根一样的对象层次结构是因为它们遵循了 COM组件对象模型规范。它的组织结构如下操作系统注册表 └── CLSID {00024500-0000-0000-C000-000000000046} (这是 Excel 的唯一身份标识) └── Type Library (类型库记录了 Excel 有哪些类、方法、属性) └── 你的 Python/VBA 代码读取这个库自动生成对象提示。通俗总结有对象层次 程序自带一本详细的说明书你的脚本是按说明书按图索骥稳如泰山。无对象层次 程序是一间黑屋子你的脚本是蒙着眼摸墙走路靠撞墙来感知方向。因此“对象化和类的结构层次”是实现自动化的“高速公路”但不是唯一的“土路”。它决定了自动化开发的成本、稳定性和速度但不决定可能性。

更多文章