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

时间:2020-09-17 23:34:18

标签: python windows com win32com

我正在尝试从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()

并查看正在运行的对象,Reflection Workspace是列出的对象,而不是EXTRA.System。

我也用过

win32com.client.makepy.main() 

创建一个Reflection Workspace的python库,这样做时,我可以列出该对象的所有可用属性和方法,但是我不知道如何使用该新库来尽早绑定该应用程序已经处于活动状态的会话。

所以我现在的问题是:

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

  2. 为什么我可以连接到Reflection Workspace,但是使用python时,没有使用VBA时可用的COM属性?

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

1 个答案:

答案 0 :(得分:0)

我最终找到了解决方案。看来legacy compatibility保留了COM API“ EXTRA.System”,应该将“ Reflection Workspace”用于新开发。

我确定我已经尝试过了,但是在发布问题之后,我再次尝试使用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相同。

相关问题