4

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

4

1 回答 1

2

Word(以及 Excel)只会注册加载到 ROT(运行对象表)中的 VERY FIRST INSTANCE。

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

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

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

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

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

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

您想“连接”到哪个并带到前面。无论如何,这都是掷骰子,除非您对打开的特定文档窗口特别感兴趣。

From what I understand, Word will register ALL document windows in the ROT, regardless of which instance of Winword it is, so you could theoretically Use Getobject to retrieve a particular DOCUMENT, get the APPLICATION object from the DOCUMENT object and then make it VISIBLE with a NORMAL windowstate.

Here's an example of GetObject for a document

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

于 2010-10-08T20:27:36.607 回答