For some reasons the PumpWaitingMessages() is never returning 1, even if it seems that Excel has been properly closed and the process ended.
My problem is that once I have called "WithEvents", if I stop calling PumpWaitingMessages() Excel is freezing because it's waiting for the events to be processed. Is there any way to "undo" what "WithEvents" is doing so that the server (Excel) is not waiting for the message to be pumped (and do not freeze if I stop calling PumpWaitingMessages()) ? Thanks a lot for your help, G. ________________________________ De : Mark Hammond <mhamm...@skippinet.com.au> Envoyé : 29 novembre 2024 14:10 À : Gauthier ABRIAL <g_abr...@hotmail.com>; python-win32@python.org <python-win32@python.org> Objet : Re: [python-win32] How to correctly handle events using win32com ? It's been a while since I've done any of this, but I think there's an "xlApp.Quit()" method you can use? If so, then you might be able to break out of the look when "PumpWaitingMessages()" returns 1 - that will mean the message queue has received a WM_QUIT. On 2024-11-29 12:17 p.m., Gauthier ABRIAL wrote: Hello, I'm looking for some advice on how to correctly handle events using win32com. If I take the example of a very simple Excel automation, I tested two things. * Code1 below use pythoncom.PumpMessages() but I don't know how to stop it when the Excel is closing. I guess I should send a WM_QUIT message but I don't know how. * Code2 below use a while loop on pythoncom.PumpWaitingMessages() but once I stop the loop the COM server freeze as it is waiting for the messages it sends to be processed before closing. I guess I should pump all the remaining messages but I don't know how. Maybe I should use a totally different approach. Thanks a lot for your help. G. -------------------- Code1 Starts ----------------------- import win32com.client as win32 import pythoncom #The event handlers class wbEvents: def OnBeforeClose(self, Cancel): print('Closing Workbook') # Send WM_QUIT here ? xlApp = win32.Dispatch("Excel.Application") #Open Excel xlApp.Visible=True #Make Excel Visible xlwb = xlApp.Workbooks.Add() #Create a workbook ws=xlwb.Sheets("Sheet1") #Get the first worksheet xl_events=win32.WithEvents(xlwb,wbEvents) #Add and Event handler pythoncom.PumpMessages() -------------------- Code1 Ends ----------------------- -------------------- Code2 Starts ----------------------- import win32com.client as win32 import pythoncom import time #The event handlers class wbEvents: def OnBeforeClose(self, Cancel): print('Closing Workbook') global keepOpen keepOpen = False xlApp = win32.Dispatch("Excel.Application") #Open Excel xlApp.Visible=True #Make Excel Visible xlwb = xlApp.Workbooks.Add() #Create a workbook ws=xlwb.Sheets("Sheet1") #Get the first worksheet xl_events=win32.WithEvents(xlwb,wbEvents) #Add and Event handler # define initalizer keepOpen = True while keepOpen: time.sleep(0.1) pythoncom.PumpWaitingMessages() -------------------- Code2 Ends ----------------------- _______________________________________________ python-win32 mailing list python-win32@python.org<mailto:python-win32@python.org> https://mail.python.org/mailman/listinfo/python-win32
_______________________________________________ python-win32 mailing list python-win32@python.org https://mail.python.org/mailman/listinfo/python-win32