Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: senior wapo en 27 de Febrero de 2007, 09:08:31 PM

Título: Detectar ALT-TAB antes de perder el foco (Win32)
Publicado por: senior wapo en 27 de Febrero de 2007, 09:08:31 PM
Necesito detectar la pulsación de ALT-TAB en windows. No necesito bloquearlo, solo detectarlo y ejecutar una rutina antes de perder el foco de la aplicación.

Cosas que he probado:

1. SetWindowsHookEx con WH_KEYBOARD_LL: no me permite interceptar directamente sin usar una DLL externa.
2.  Mensaje WM_ACTIVATEAPP: no me vale porque cuando pulsas ALT-TAB aparece la lista de tareas pero la aplicación no pierde el foco hasta que soltamos ALT-TAB (y siempre que la selección sea otra ventana).

Gracias.
Título: Detectar ALT-TAB antes de perder el foco (Win32)
Publicado por: Titonus en 06 de Marzo de 2007, 12:08:31 AM
El problema es que Windows siempre se te va adelantar a detectar ALT-TAB por el proceso task-switching (ALT-TAB) que consume de forma preferente/prioritaria los mensajes que provoca ALT-TAB, y para poder comprobarlo/usarlo deberías desactivar dicho proceso temporalmente.
En Windows 95/98 es más facil que en 2000/XP. Vamos lo que tu comentas en 1 tendrás que hacer prácticamente.

Se documenta el problema y la solución en este enlace:
http://msdn.microsoft.com/msdnmag/issues/02/09/CQA/
Título: Detectar ALT-TAB antes de perder el foco (Win32)
Publicado por: senior wapo en 06 de Marzo de 2007, 02:30:43 AM
Gracias por el mensaje.

Aunque se supone que no se puede sin usar DLLs externas, he descubierto una cosa.

En mi Windows XP (sin SP) coincide que al pulsar ALT-TAB primero envía a la aplicación un mensaje WM_CANCELMODE y a continuación salta la lista de tareas.

Lo que hago es procesar el mensaje WM_CANCELMODE y detectar si estan pulsadas ALT y TAB con GetAsyncKeyState().

Lo he descubierto por pura casualidad volcando a un log todos los mensajes que recibo y probando cosas.

El problema es que no parece muy fiable. No se si dicho comportamiento se da en todos los XPs, y si va en windows 2000 o NT.
Lo que si he comprobado es que no funciona en win9X (aunque en 9x puedo usar el truco ya documentado del salvapantallas).