РЕДАКТИРОВАТЬ ДЛЯ КОММЕНТАРИЙ
Возможно, есть лучший способ сделать это.
Установите отличный psutil
import psutil
excelPids = []
for proc in psutil.process_iter():
if proc.name == "EXCEL.EXE": excelPids.append(proc.pid)
Теперь перечислите окна, но получите заголовок окна и pid.
windowPidsAndTitle = []
win32gui.EnumWindows(lambda hwnd, resultList: resultList.append((win32gui.GetWindowThreadProcessId(hwnd),win32gui.GetWindowText(hwnd))), windowPidsAndTitle)
Теперь просто найдите первый pid, который есть в наших ExcelPids
for pid,title in windowPidsAndTitle:
if pid in excelPids:
return title
КОНЕЦ РЕДАКТИРОВАНИЯ
Здесь нужно принять во внимание ряд вещей:
В одном экземпляре открыто несколько рабочих книг? В этом случае
xl = win32com.client.Dispatch("Excel.Application")
xl.ActiveWorkbook.FullName
Действительно даст вам последнюю активную книгу.
Или запущены отдельные экземпляры EXCEL.EXE? Вы можете получить каждый экземпляр с помощью :
xl = win32com.client.GetObjec(None, "Excel.Application") #instance one
xl = win32com.client.GetObject("Name_Of_Workbook") #instance two
Но это побеждает цель, потому что вам нужно знать имя И это не скажет вам, какой последний был в фокусе.
К @tgrays комментарию выше, если ваш экземпляр Excel гарантированно будет передним окном, тогда:
import win32gui
win32gui.GetWindowText(win32gui.GetForegroundWindow())
#parse this and use GetObject to get your excel instance
Но в худшем случае scenerio, несколько экземпляров, и вы должны найти, какой фокус был последним, вам придется перечислить все окна и найти то, что вам нужно:
windows = []
win32gui.EnumWindows(lambda hwnd, resultList: resultList.append(win32gui.GetWindowText(hwnd)),windows)
#enumerates all the windows open from the top down
[i for i in windows if "Microsoft Excel" in i].pop(0)
#this one is closest to the top
Удачи с этим!