Получение последнего открытого объекта документа MS Word

У меня есть скрипт Python, вызываемый из подпрограммы VBA AutoNew () в шаблоне MS Word 2003 (.dot) - поэтому он запускается каждый раз, когда документ создается из этого шаблона Word.

Стороннее приложение создает документы из этого шаблона. Существует ряд проблем с форматированием того, как стороннее приложение настраивает документ, поэтому мой скрипт настраивает его после завершения работы стороннего скрипта. (Первоначально я написал скрипт на VBA, но проблемы с таймером VBA приводят к его сбою в значительной части времени. Версия Python работает без нареканий.)

Я хочу, чтобы скрипт работал только с документом, который его вызвал, который всегда будет самым последним открытым файлом Word. (Это файл .doc, а не .docx, если это имеет какое-то значение.) Я нашел три способа получить открытый экземпляр Word (поскольку этот скрипт вызывается AutoNew, всегда будет доступный открытый экземпляр):

win32com.client.GetActiveObject (Class = 'Word.Application')
win32com.client.gencache.EnsureDispatch('Word.Application')
win32com.client.Dispatch('Word.Application')

Любой из этих трех отлично работает, если только что созданный документ является единственным открытым файлом Word. Но если документ Word уже открыт, и я запускаю стороннее программное обеспечение для создания нового документа из этого шаблона, скрипт python каждый раз захватывает старый экземпляр всеми тремя методами.

Я попытался найти способы перебрать документы Word, имея в виду, что я могу проверить все имена и выбрать имя с наибольшим номером в конце (во время выполнения скрипта документ не будет сохранен, поэтому его name будет Document1, Document2 и т. д.) К сожалению, я нашел только методы для циклического обхода закрытых документов (открытие одного, выполнение чего-либо, закрытие его, переход к следующему), а не (как в моем случае) уже открытых.

Есть ли способ направить Python в самый последний открытый документ Word?

РЕДАКТИРОВАТЬ Связанный вопрос:Word VBA и несколько слов экземпляров

Я нашел, как получить целое число в Windows для документа, которым я хочу управлять:

import win32gui
import re

#Create a list of all open Microsoft Word document titles and their
#handle integers
titles = []
def foreach_window(hwnd, lParam):
    if win32gui.IsWindowVisible(hwnd):
        title = win32gui.GetWindowText(hwnd)
        if 'Microsoft Word' in title:
            titles.append([title, hwnd])
    return True
win32gui.EnumWindows(foreach_window, None)

#Find the handle of the newest open, unsaved Word document
winOrder = []
for s in titles:
    item = re.search(r'Document\d', s[0])
    if item:
        winOrder.append(int(re.search(r'\d+', s[0]).group()))
    else:
        winOrder.append(0)
hwnd = titles[winOrder.index(max(winOrder))][1]

#Get the edit window from inside the Word instance
def callback(hwnd, hwnds):
    if win32gui.GetClassName(hwnd) == '_WwG':
        hwnds.append(hwnd)
        #I think there should be a 'return False' here to let EnumChildWindows
        #know it doesn't have to keep looping once it finds the edit window,
        #but it crashes with 'pywintypes.error: (0, 'EnumChildWindows', 
        #'No error message is available') if I try that
    return True
hwnds = []
win32gui.EnumChildWindows(whndl, callback, hwnds)

#Something like this...
#window = win32gui.AccessibleObjectFromWindow(hwnds[0])

Итак, теперь - как создать COM-объект из дескриптора Windows?

Ответы на вопрос(1)

Ваш ответ на вопрос