OLE自动化推出MS Word并带到前台

什么是“正确”(推荐)的方法来连接到MS Word的正在运行的实例,并将此应用程序放在前面? 我正在做一个类似于VBA应用程序的以下内容:

...
objWord = GetObject ("Word.Application")
if (objWord is nothing) then
  objWord = CreateObject("Word.Application")
end if
objWord.Activate()
objWord.Visible = true
objWord.WindowState = 1 'maximized
...

在带有Word 2007的Windows XP上运行时,大多数情况下都是如此 - 但是周期性地无法将Word窗口放在前面(而是在任务栏中闪烁Word的最小化图标)。

:我通过使用FindWindow Win API调用部分解决了此问题:

hwnd = FindWindow("OpusApp", vbNullString)
If hwnd > 0 Then 
  SetForegroundWindow (hwnd)
end if

这不是100%,因为(正如drventure指出的那样),如果Word的多个实例正在运行,那么您无法确定哪一个将得到处理。 因为当我的代码启动Word时,它首先使用GetObject,如果失败则使用CreateObject,只要有一个Word开始的实例,我就可以。


Word(和Excel就此而言)将仅注册加载到ROT(运行对象表)中的VERY FIRST INSTANCE。

ROT是GETOBJECT“获取对象”的地方,因此,在某些情况下,它可能会加载两个WinWord.exe实例,一个可见,一个不可见,但不可见实例是在ROT中注册的实例,而可见一个不是。

这会让你看到你所看到的行为。

不幸的是,如果没有一些API调用来枚举系统上的所有打开的窗口,那么您总会冒着GETOBJECT不会让您获得您期望的对象的风险。

没有太多办法解决这个问题。

而且,你的最终目标无论如何都有点怀疑。

当你说“连接到正在运行的MS Word实例并将该应用程序放在前面时,什么是”正确的“方法?”,如果加载了2个或更多实际的Winword.exe实例,会发生什么情况?

你想要“连接”并将其带到前面。 无论如何,这是掷骰子的一部分,除非您特别关注打开的特定DOCUMENT窗口。

根据我的理解,Word将在ROT中注册所有文档窗口,而不管它是哪个Winword实例,所以理论上可以使用Getobject来检索特定的DOCUMENT,从DOCUMENT对象中获取APPLICATION对象,然后使其可见一个正常的窗口状态。

以下是文档的GetObject示例

http://support.microsoft.com/kb/307216

链接地址: http://www.djcxy.com/p/55921.html

上一篇: OLE Automation to launch MS Word and bring to front

下一篇: 'WSGIRequest' object has no attribute 'build