2009-09-11 17 views
7

Quando si utilizza win32api.setConsoleCtrlHandler(), sono in grado di ricevere eventi di spegnimento/disconnessione/ecc. Da Windows e chiudere correttamente la mia app.Python - Eventi di spegnimento di Windows

Tuttavia, questo funziona solo quando si esegue l'applicazione in python.exe (ad esempio, ha una finestra della console), ma non in pythonw.exe (nessuna finestra della console).

Esiste un modo equivalente in Windows per ricevere questi eventi quando non si dispone di alcuna console e nessuna finestra per riceverli? O c'è un modo programmatico per nascondere la finestra della console?

Per essere chiari, il mio obiettivo è essere in grado di ricevere correttamente eventi di spegnimento/disconnessione/ecc. Di Windows, senza mostrare alcun tipo di finestra della console.

MODIFICA: Ho giocato in giro e sono andato un po 'oltre. Ho scritto un pezzo di codice di prova per questo. Quando eseguo un "taskkill/im pythonw.exe", riceverà il messaggio.

Tuttavia, quando eseguo un arresto, riavvio o disconnessione su Windows, non ricevo alcun messaggio.

Ecco tutta la faccenda:

""" Testing Windows shutdown events """ 

import win32con 
import win32api 
import win32gui 
import sys 
import time 
#import os 

def log_info(msg): 
    """ Prints """ 
    print msg 
    f = open("c:\\test.log", "a") 
    f.write(msg + "\n") 
    f.close() 

def wndproc(hwnd, msg, wparam, lparam): 
    log_info("wndproc: %s" % msg) 

if __name__ == "__main__": 
    log_info("*** STARTING ***") 
    hinst = win32api.GetModuleHandle(None) 
    wndclass = win32gui.WNDCLASS() 
    wndclass.hInstance = hinst 
    wndclass.lpszClassName = "testWindowClass" 
    messageMap = { win32con.WM_QUERYENDSESSION : wndproc, 
        win32con.WM_ENDSESSION : wndproc, 
        win32con.WM_QUIT : wndproc, 
        win32con.WM_DESTROY : wndproc, 
        win32con.WM_CLOSE : wndproc } 

    wndclass.lpfnWndProc = messageMap 

    try: 
     myWindowClass = win32gui.RegisterClass(wndclass) 
     hwnd = win32gui.CreateWindowEx(win32con.WS_EX_LEFT, 
            myWindowClass, 
            "testMsgWindow", 
            0, 
            0, 
            0, 
            win32con.CW_USEDEFAULT, 
            win32con.CW_USEDEFAULT, 
            win32con.HWND_MESSAGE, 
            0, 
            hinst, 
            None) 
    except Exception, e: 
     log_info("Exception: %s" % str(e)) 


    if hwnd is None: 
     log_info("hwnd is none!") 
    else: 
     log_info("hwnd: %s" % hwnd) 

    while True: 
     win32gui.PumpWaitingMessages() 
     time.sleep(1) 

Mi sento come se fossi abbastanza vicino qui, ma io sono sicuramente manca qualcosa!

risposta

7

Il problema era che il tipo di finestra HWND_MESSAGE non riceve effettivamente messaggi broadcast, come WM_QUERYENDSESSION e WM_ENDSESSION.

Quindi invece di specificare win32con.HWND_MESSAGE per il parametro "finestra padre" di CreateWindowEx(), ho appena specificato "0".

Fondamentalmente, questo crea una finestra effettiva, ma non la mostro mai, quindi è effettivamente la stessa cosa. Ora, posso ricevere correttamente quei messaggi broadcast e chiudere correttamente l'app.

+0

come eseguire questo ... ho provato a eseguire la scriipt fornita, ma non restituisce il sistema antintrusione Logogg, gli eventi di arresto o anche se uccido l'attività dal task manager – Rao

4

Se non si dispone di una console, l'impostazione di un gestore di console, ovviamente, non può funzionare. È possibile ricevere eventi di sistema su un programma GUI (non da console), rendendo un'altra finestra (non deve essere visibile), assicurandosi di avere una normale "message pump" su di esso che servono, e la gestione WM_QUERYENDSESSION - questo è il messaggio indicando la tua finestra sugli eventi di spegnimento e disconnessione (e la tua finestra può provare a respingere la sessione finale restituendo 0 per questo messaggio). ("I servizi Windows" sono diversi dalle normali app: se è quello che stai scrivendo, vedi un esempio here).

+0

ho provato il codice di cui sopra, ma non ho mai ottenere l'evento di sistema sparando alla disconnessione/spegnimento. Puoi aiutarmi qui ....? – Rao

Problemi correlati