Letzt geöffnetes MS Word-Dokumentobjekt erhalten

Ich habe ein Python-Skript, das von einem VBA AutoNew () -Unter in einer MS Word 2003-Vorlage (.dot) aufgerufen wird - es wird also jedes Mal ausgeführt, wenn ein Dokument aus dieser Word-Vorlage erstellt wird.

Eine Drittanbieteranwendung erstellt Dokumente aus dieser Vorlage. Es gibt eine Reihe von Formatierungsproblemen bei der Einrichtung des Dokuments durch die Drittanbieteranwendung. Daher muss ich das Skript anpassen, sobald das Drittanbieter-Skript ausgeführt wurde. (Ich habe das Skript ursprünglich in VBA geschrieben, aber Probleme mit dem VBA-Zeitgeber führen dazu, dass es einen erheblichen Bruchteil der Zeit abstürzt. Die Python-Version funktioniert einwandfrei.)

Ich möchte, dass das Skript nur mit dem Dokument arbeitet, das es aufgerufen hat. Dies ist immer die zuletzt geöffnete Word-Datei. (Die Datei ist eine DOC-Datei und keine DOCX-Datei, wenn dies einen Unterschied macht.) Ich habe drei Möglichkeiten gefunden, um eine offene Instanz von Word zu erhalten (da dieses Skript von AutoNew aufgerufen wird, ist immer eine offene Instanz verfügbar):

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

Alle diese drei funktionieren hervorragend, wenn das neu erstellte Dokument die einzige offene Word-Datei ist. Wenn jedoch ein Word-Dokument bereits geöffnet ist und ich die Software eines Drittanbieters ausführe, um ein neues Dokument aus dieser Vorlage zu erstellen, greift das Python-Skript jedes Mal mit allen drei Methoden auf die ältere Instanz zu.

Ich habe nach Wegen gesucht, um Word-Dokumente zu durchlaufen, mit der Idee, dass ich alle Namen überprüfen und den mit der höchsten Nummer am Ende auswählen könnte (zum Zeitpunkt der Ausführung des Skripts wird das Dokument nicht gespeichert, also Der Name lautet "Document1", "Document2" usw.) Leider habe ich nur Methoden gefunden, um geschlossene Dokumente zu durchlaufen (ein Dokument öffnen, etwas tun, es schließen, zum nächsten übergehen), nicht (wie in meinem Fall) bereits geöffnete.

Gibt es eine Möglichkeit, Python zum zuletzt geöffneten Word-Dokument zu leiten?

BEARBEITE Verwandte Frage:Word VBA und mehrere Word-Instanzen

Ich habe herausgefunden, wie ich die Windows-Handle-Ganzzahl des Dokuments erhalte, das ich steuern möchte:

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])

So jetzt - wie erstelle ich ein COM-Objekt aus dem Windows-Handle?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage