gpt4 book ai didi

vba - OLE 自动化启动 MS Word 并置于前台

转载 作者:行者123 更新时间:2023-12-04 21:58:39 25 4
gpt4 key购买 nike

连接到正在运行的 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(运行对象表)中加载的非常第一个实例。

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

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

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

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

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

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

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

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

这是文档的 GetObject 示例

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

关于vba - OLE 自动化启动 MS Word 并置于前台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3860250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com