代码之家  ›  专栏  ›  技术社区  ›  Ed Schembor

启动MS Word并将其置于最前面的OLE自动化

  •  3
  • Ed Schembor  · 技术社区  · 15 年前

    连接到正在运行的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 回复  |  直到 14 年前
        1
  •  2
  •   DarinH    15 年前

    Word(和Excel)将只注册在rot(运行对象表)中加载的第一个实例。

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

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

    不幸的是,如果没有一些API调用来枚举系统上所有打开的窗口,则始终存在getObject无法获得预期对象的风险。

    解决这个问题的办法不多。

    另外,你的最终目标还是有点可疑。

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

    你想把它“连接”到前面。不管怎样,这是一个骰子,除非您对打开的特定文档窗口特别感兴趣。

    据我所知,Word将注册rot中的所有文档窗口,不管它是winword的哪个实例,因此理论上,您可以使用getobject来检索特定文档,从文档对象中获取应用程序对象,然后使用普通的windowstate使其可见。

    以下是文档的getObject示例

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

    推荐文章