早上好。
我遇到了让我的代码找到其他单词实例的问题,并且经过大量谷歌搜索后遇到了问题。
下面的我的代码将找到所有打开的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
答案 0 :(得分:2)
从我所看到的,并且明白了,唯一确定的方法就是遍历运行的单词实例,然后依次杀死每个单词以确保你获得下一个实例。 / p>
由于在运行对象表中的单词注册对于它自身的每个实例都是完全相同的,所以没有先关闭你正在查看的那个实例就无法通过它们。
这种方法的一个选项,可能是不可取的,是在您杀死应用程序实例时获取所有文件名,然后将它们全部加载到您创建的一个实例中。
或者,如果您知道打开文件的名称,则可以通过打开文件名“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.
答案 1 :(得分:0)
这是一个旧线程,但我也需要遍历Word实例并在此处碰到。
按照@ Pow-Ian的建议,我试图做
如果您首先进入该头并且能够枚举该词 通过hwnd实例,那么您可能会轮流关注每个实例 然后列出文件名。
尽管我已经设法解决了所有问题,但是通过AccessibleObjectFromWindow,我发现了一种针对Office应用程序的更简单策略,并且我们的问题现在已经解决。
此外,我相信代码显示@ Pow-lan的输入错误
Do While Not objWordDocument is nothing
,且应为:
Do While Not objWordApplication is nothing