使用pywin32获取Python中COM对象的运行实例

2024-05-17 06:22:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从python自动化反射桌面中的操作。我以前用VBA成功地做到了这一点,如下所示:

Set Session = CreateObject("Reflection Workspace")

然后,这将为我提供活动会话:

Set Screen = Session.GetObject("Frame").SelectedView.Control.Screen

或者这给了我一个特定的课程:

Set Screen = Session.tView(iView).Control.Screen

在python中执行此操作时,我预计COM对象应该是相同的,并且根据本指南Attach to a running instance of a COM application,我应该能够连接到运行中的应用程序,如下所示:

system = win32com.client.GetObject('Reflection Workspace') 

虽然这不会返回任何错误,但我也找不到任何可用的属性。如果我改为使用:

system = win32com.client.gencache.EnsureDispatch('EXTRA.System')

我可以使用以下方法获取活动会话:

screen = system.ActiveSession.Screen

一切正常。如果我跑

win32com.client.combrowse.main()

看看正在运行的对象,反射工作区是列出的,而不是EXTRA.System

我也用过

win32com.client.makepy.main() 

要创建反射工作区的python库,我可以列出该对象的所有可用属性和方法,但我不知道如何使用该新库提前绑定应用程序的已激活会话

因此,我在这一点上的问题是:

  1. 如果COM浏览器显示的是反射工作区而不是EXTRA.System,为什么我可以连接到EXTRA.System作为正在运行的进程

  2. 为什么我可以连接到反射工作区,但在使用VBA时可用的COM属性在使用python时都不可用

  3. 有人能指出如何使用makepy()创建的库将正在运行的COM进程实际分配给对象的指南吗


Tags: 对象comclient属性sessionvbaextrascreen
1条回答
网友
1楼 · 发布于 2024-05-17 06:22:42

我最终找到了解决办法。看起来COM API“EXTRA.System”是为legacy compatibility保留的,而“反射工作区”应该用于新的开发

我确信我已经试过了,但在发布问题后,我再次尝试使用GetObject来获取反射帧对象,并且成功了。因此,对于其他试图在python中实现这一点的人,您可以使用以下方法创建应用程序对象:

system = win32com.client.GetObject('Reflection Workspace')

然后获取活动视图:

screen = system.GetObject("Frame").SelectedView.Control.Screen

或获取特定视图,其中1是视图编号:

screen = system.GetObject("Frame").view(1).Control.Screen

之后,这些方法与GetText、PutText等的documentation方法相同

相关问题 更多 >