Estoy implementando un reemplazo de la barra de tareas, un programa de estilo de cambio de aplicación similar a un dock. Está haciendo algunas cosas únicas con OpenGL, y con atajos de teclado, por lo que la forma en que está configurado, la ventana no siempre tiene foco. Me gustaría implementarlo de modo que pueda traer una ventana arbitraria al primer plano, al igual que lo haría una barra de tareas o un programa ALT-TAB.Windows 7: ¿cómo llevar una ventana al frente sin importar qué otra ventana tenga foco?
Sin embargo, mi código simplemente hace que el icono de la aplicación parpadee en la barra de tareas. La documentación de la API de Windows dice que esto es lo que se supone que debe suceder, pero estoy buscando una forma de evitar esto.
He adaptado mi código de los siguientes ejemplos, que dicen que la vinculación al subproceso en primer plano debería permitirle establecer la ventana en primer plano. Estos son los sitios:
http://www.voidnish.com/Articles/ShowArticle.aspx?code=dlgboxtricks
http://invers2008.blogspot.com/2008/10/mfc-how-to-steal-focus-on-2kxp.html
Mi código es el siguiente. Tenga en cuenta que se trata de utilizar las envolturas de Win32 para el pitón (self.hwnd es el identificador de la ventana quiero traer al frente):
fgwin = win32gui.GetForegroundWindow()
fg = win32process.GetWindowThreadProcessId(fgwin)[0]
current = win32api.GetCurrentThreadId()
if current != fg:
win32process.AttachThreadInput(fg, current, True)
win32gui.SetForegroundWindow(self.hwnd)
win32process.AttachThreadInput(fg, win32api.GetCurrentThreadId(), False)
Sin embargo, a menos que mi ventana es la ventana en primer plano (que no lo es por lo general), esto solo causa que el ícono del programa parpadee.
¿Estoy haciendo el engarce de hilo equivocado? ¿Hay alguna otra forma de evitar esto? Me imagino que debe haber, ya que hay muchos mezcladores de aplicaciones que parecen ser capaces de hacer esto bien.
Escribo esto en python, pero si hay una solución en otro idioma, utilizaré wrappers o haré lo que sea necesario para ponerlo en funcionamiento.
¡Gracias de antemano!
EDIT: Estaría abierto a una forma de hacerlo funcionar solo en mi computadora en particular, es decir, una forma de habilitar, en mi máquina, una forma para que cualquier aplicación tome el enfoque.
SOLUCIONADO: Lo que tienes que hacer es deshabilitar el bloqueo de primer plano. Resulta que era tan fácil como esto:
win32gui.SystemParametersInfo(win32con.SPI_SETFOREGROUNDLOCKTIMEOUT, 0, win32con.SPIF_SENDWININICHANGE | win32con.SPIF_UPDATEINIFILE)
Bien, pero hay muchas aplicaciones que pueden hacerlo. Es claramente posible, y he encontrado tutoriales diciéndome cómo. Mi pregunta es, ¿qué estoy haciendo que hace que el código del tutorial no funcione? – jmite
¿por qué no toma un código de uno de estos tutoriales y ejecuta ese –
? Eso es lo que hice. El código que publiqué es casi el código exacto del tutorial, en un contenedor de Python (compruébalo en los dos enlaces que publiqué). Pregunto si alguien puede decir por qué mi código no está haciendo lo que las páginas dicen que hará, o si hay una mejor manera de hacerlo. – jmite