@David Sansom<mailto:da...@elkpoint.co.uk>: amazing that's exactly what I was 
looking for ! That works now, PumpMessages() is correctly returning when I call 
PostQuitMessage().
So the reason why Excel is not sending the WM_QUIT message by itself (or why 
PumpMessage() is not receiving it) is still unclear to me but I have a workable 
solution and I know that the way I use win32com seems to make sense (nobody 
gave me any pushback here on the way I use it).
Thanks a lot everybody.
G.
________________________________
De : David Sansom <da...@elkpoint.co.uk>
Envoyé : 30 novembre 2024 05:04
À : Gauthier ABRIAL <g_abr...@hotmail.com>
Cc : python-win32@python.org <python-win32@python.org>
Objet : Re: [python-win32] How to correctly handle events using win32com ?

Hi,


  *
 I guess I should send a WM_QUIT message but I don't know how.

Have you tried win32api.PostQuitMessage() in the event handler for Code 1?

DS

Sent from my iPhone

On 29 Nov 2024, at 18:00, Gauthier ABRIAL <g_abr...@hotmail.com> 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
https://mail.python.org/mailman/listinfo/python-win32
_______________________________________________
python-win32 mailing list
python-win32@python.org
https://mail.python.org/mailman/listinfo/python-win32

Reply via email to