2

早上好。

我在让我的代码找到其他单词实例时遇到问题,并且在经过大量谷歌搜索后遇到了障碍。

下面的我的代码将找到所有打开的 word 文档并将它们填充到组合框中。

我的问题是我们的应用程序(我无法控制这些)将在新实例中打开 word 文档,因此我的代码将无法找到/控制这些文档。

有任何想法吗?

Dim objWordDocument As Word.Document
Dim objWordApplication As Word.Application


'//find all open word documents
Set objWordApplication = GetObject(, "Word.Application")

'//clear combobox
    OpenDocs.Clear

'//add all open documents to combo box

        For Each objWordDocument In objWordApplication.Documents

            OpenDocs.AddItem objWordDocument.Name

        Next objWordDocument
4

2 回答 2

3

根据我所见并理解,唯一可靠的方法是遍历 word 的运行实例,然后依次杀死每个实例,以确保您获得下一个实例。

由于单词在运行对象表中的每个实例都以完全相同的方式注册,因此如果不先关闭您正在查看的对象,就无法通过它们。

这种方法的一个选项(可能是不可取的)是在您终止应用程序实例时获取所有文件名,然后将它们全部加载回您创建的一个实例中。

或者,如果您知道打开文件的名称,您可以通过打开文件名“getObject”,因为 Word 会将其文档名称推送到正在运行的对象表中,遗憾的是这听起来不像您的情况。

如果不编写活动的 x MFC 服务,您将无法做您想做的事情。

我希望这会有所帮助。

编辑:

关于子类化和 Windows API 以获得句柄以改变焦点进行了广泛的讨论。http://www.xtremevbtalk.com/showthread.php?t=314637

如果您首先深入到该头部并能够通过 hwnd 枚举单词实例,那么您可能会依次关注每个实例,然后列出文件名。不过我确实警告过你;那是一些令人讨厌的子类化,这是只有一些真正想不小心破坏东西的人才会玩的黑魔法。

无论如何,如果您想查看一个实例,请杀死,重复,重新打开试试这个:

改编自此线程:http ://www.xtremevbtalk.com/showthread.php?t=316776

Set objWordApplication = GetObject(, "Word.Application")

'//clear combobox
    OpenDocs.Clear

'//add all open documents to combo box

   Do While Not objWordDocument is nothing 

        For Each objWordDocument In objWordApplication.Documents

            OpenDocs.AddItem objWordDocument.Name

        Next objWordDocument
        objWordApplication.Quit False
        Set objWordApplication = Nothing
        Set objWordApplication = GetObject(, "Word.Application")
   loop

   ** use create object to open a new instance of word here and then go though
   ** your list of files until you have opened them all as documents in the new
   ** instance.
于 2012-11-29T20:57:19.467 回答
0

这是一个旧线程,但我也需要遍历 Word 实例并在这里碰到。

按照@Pow-Ian 的建议,我尝试做

如果您首先深入到该头部并能够通过 hwnd 枚举单词实例,那么您可能会依次关注每个实例,然后列出文件名。

虽然我已经设法获得了所有的句柄,但我通过AccessibleObjectFromWindow找到了一个更简单的关于办公应用程序的策略,我们的问题现在已经解决了。

另外,我相信代码显示@Pow-lan's 在

Do While Not objWordDocument is nothing

应该是:

Do While Not objWordApplication is nothing
于 2019-01-28T19:13:41.843 回答