當(dāng)使用win32api.setConsoleCtrlHandler()時,我能夠從Windows接收shutdown / logoff / etc事件,并干凈地關(guān)閉我的應(yīng)用程序。但是,這僅在python.exe(即具有控制臺窗口)下運行應(yīng)用程序時有效,而在pythonw.exe(無控制臺窗口)下運行應(yīng)用程序時有效。當(dāng)您沒有控制臺且沒有窗口接收這些事件時,Windows中是否有一種等效的方式來接收這些事件?或者,是否有編程方式隱藏控制臺窗口?明確一點-我的目標(biāo)是能夠成功接收Windows關(guān)閉/注銷/等事件,而無需顯示任何類型的控制臺窗口。編輯: 我一直在玩,并且我已經(jīng)走了很多。我為此編寫了一段測試代碼。當(dāng)我執(zhí)行“ taskkill / im pythonw.exe”時,它將收到該消息。但是,當(dāng)我在Windows上關(guān)閉,重新啟動或注銷時,沒有收到任何消息。整個過程如下:""" Testing Windows shutdown events """import win32conimport win32apiimport win32guiimport sysimport timedef 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:我覺得我離這里很近,但我肯定缺少什么!
2 回答

慕容森
TA貢獻(xiàn)1853條經(jīng)驗 獲得超18個贊
這里的問題是HWND_MESSAGE窗口類型實際上未接收到廣播消息,例如WM_QUERYENDSESSION和WM_ENDSESSION。
因此,我沒有指定win32con.HWND_MESSAGE作為CreateWindowEx()的“父窗口”參數(shù),而是指定了“ 0”。
基本上,這會創(chuàng)建一個實際的窗口,但我從未展示過它,因此實際上是同一回事?,F(xiàn)在,我可以成功接收這些廣播消息并正確關(guān)閉該應(yīng)用程序。

湖上湖
TA貢獻(xiàn)2003條經(jīng)驗 獲得超2個贊
如果您沒有控制臺,那么設(shè)置控制臺處理程序當(dāng)然是行不通的。您可以通過打開另一個窗口(不必可見)在GUI(非控制臺)程序上接收系統(tǒng)事件,確保在其上提供并處理一個正常的“消息泵”,這WM_QUERYENDSESSION就是消息在告訴您的窗口有關(guān)關(guān)閉和注銷事件(您的窗口可以通過為此消息返回0來嘗試向結(jié)束會話回退)。(“ Windows服務(wù)”與普通應(yīng)用程序不同-如果您正在編寫,請參見此處的示例)。
添加回答
舉報
0/150
提交
取消