obtener manejador de ventana desde el proceso iniciado

Veo que hay win32process.GetWindowThreadProcess() que obtiene un controlador de ventana y devuelve su ID de proceso. ¿Hay una manera de hacer lo contrario: obtener el controlador de la ventana de un proceso en ejecución por su id de proceso? Algo como win32gui.GetWindowHandler(processId) ?

Específicamente lo que estoy tratando de hacer:

Tengo un script en Python que ejecuta un progtwig externo, digamos notepad.exe.
El Bloc de notas se runProgram() cuando se runProgram() al método runProgram() . Quiero evitar que este método ejecute el Bloc de notas más de una vez. Lo logro de la siguiente manera, usando win32process :

 import win32process as process import sys PORTABLE_APPLICATION_LOCATION = "C:\\Windows\\system32\\notepad.exe" processHandler = -1 def runProgram(): global processHandler #don't run a process more than once if (isLiveProcess(processHandler)): #Bring focus back to running window! return; try: startObj = process.STARTUPINFO() myProcessTuple = process.CreateProcess(PORTABLE_APPLICATION_LOCATION,None,None,None,8,8,None,None,startObj) processHandler = myProcessTuple[2] except: print(sys.exc_info[0]) def isLiveProcess(processHandler): #Process handler is dwProcessId processList = process.EnumProcesses() for aProcess in processList: if (aProcess == processHandler): return True return False runProgram() 

Esto funciona como se esperaba, pero si se encuentra que el proceso ya está vivo, me gustaría traer su ventana al frente con win32gui

No creo que la API de Windows proporcione un método para esto, pero podrías recorrer todas las ventanas abiertas y encontrar el que te pertenece.

He modificado tu progtwig para que se vea así:

 import win32process import win32process as process import win32gui import sys PORTABLE_APPLICATION_LOCATION = "C:\\Windows\\system32\\notepad.exe" processHandler = -1 def callback(hwnd, procid): if procid in win32process.GetWindowThreadProcessId(hwnd): win32gui.SetForegroundWindow(hwnd) def show_window_by_process(procid): win32gui.EnumWindows(callback, procid) def runProgram(): global processHandler #don't run a process more than once if (isLiveProcess(processHandler)): #Bring focus back to running window! show_window_by_process(processHandler) return; try: startObj = process.STARTUPINFO() myProcessTuple = process.CreateProcess(PORTABLE_APPLICATION_LOCATION,None,None,None,8,8,None,None,startObj) processHandler = myProcessTuple[2] except: print(sys.exc_info[0]) def isLiveProcess(processHandler): #Process handler is dwProcessId processList = process.EnumProcesses() for aProcess in processList: if (aProcess == processHandler): return True return False runProgram()