OLE自动化启动MS Word并带到前面

时间:2010-10-05 01:10:58

标签: vba ms-word ole-automation

连接到正在运行的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运行实例开始,我就可以了。

1 个答案:

答案 0 :(得分:2)

Word(以及Excel)将只注册在ROT(运行对象表)中加载的非常第一个实例。

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

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

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

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

此外,无论如何,你的最终目标有点可疑。

当您说“连接到正在运行的MS Word实例并将此应用程序置于最前面的”是什么“正确的”方法?“如果有两个或更多实际的Winword.exe实例加载会怎样?< / p>

您想要“连接”并带到前面。无论如何,这是一个骰子,除非你对特定的DOCUMENT窗口特别感兴趣。

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

以下是文档的GetObject示例

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