# win32traceutil like utility for Pythonwin import _thread import win32api import win32event import win32trace from pywin.framework import winout outputWindow = None def CollectorThread(stopEvent, file): win32trace.InitRead() handle = win32trace.GetHandle() # Run this thread at a lower priority to the main message-loop (and printing output) # thread can keep up import win32process win32process.SetThreadPriority( win32api.GetCurrentThread(), win32process.THREAD_PRIORITY_BELOW_NORMAL ) try: while 1: rc = win32event.WaitForMultipleObjects( (handle, stopEvent), 0, win32event.INFINITE ) if rc == win32event.WAIT_OBJECT_0: # About the only char we can't live with is \0! file.write(win32trace.read().replace("\0", "")) else: # Stop event break finally: win32trace.TermRead() print("Thread dieing") class WindowOutput(winout.WindowOutput): def __init__(self, *args): winout.WindowOutput.__init__(*(self,) + args) self.hStopThread = win32event.CreateEvent(None, 0, 0, None) _thread.start_new(CollectorThread, (self.hStopThread, self)) def _StopThread(self): win32event.SetEvent(self.hStopThread) self.hStopThread = None def Close(self): self._StopThread() winout.WindowOutput.Close(self) # def OnViewDestroy(self, frame): # return winout.WindowOutput.OnViewDestroy(self, frame) # def Create(self, title=None, style = None): # rc = winout.WindowOutput.Create(self, title, style) return rc def MakeOutputWindow(): # Note that it will not show until the first string written or # you pass bShow = 1 global outputWindow if outputWindow is None: title = "Python Trace Collector" # queueingFlag doesnt matter, as all output will come from new thread outputWindow = WindowOutput(title, title) # Let people know what this does! msg = """\ # This window will display output from any programs that import win32traceutil # win32com servers registered with '--debug' are in this category. """ outputWindow.write(msg) # force existing window open outputWindow.write("") return outputWindow if __name__ == "__main__": MakeOutputWindow()