编辑评论
可能有更好的方法来做到这一点.
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)
现在只需找到我们的excelPids中的第一个pid
for pid,title in windowPidsAndTitle:
if pid in excelPids:
return title
结束编辑
这里有许多事情需要考虑:
一个实例是否有多个工作簿打开?在这种情况下
xl = win32com.client.Dispatch("Excel.Application")
xl.ActiveWorkbook.FullName
确实会给你最后一个活跃的工作簿.
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
祝你好运!