¿Hay alguna solución para evitar que las aplicaciones roben el foco de la ventana activa?
Esto es especialmente molesto cuando estoy iniciando una aplicación, cambio a hacer otra cosa y la nueva aplicación comienza a recibir media frase de texto.
windows
window-focus
svandragt
fuente
fuente
This is especially annoying when I'm starting an application, switch to do something else and the new application starts receiving half a sentence of text.
Es aún más molesto cuando aparece un cuadro de diálogo y lo descarta involuntariamente sin siquiera ver el mensaje porque presionóSpace
oEnter
mientras escribía una oración.Respuestas:
Esto no es posible sin una manipulación extensiva de los componentes internos de Windows y debe superarlo.
Hay momentos en el uso diario de la computadora cuando es realmente importante que realice una acción antes de que el sistema operativo le permita hacer otra. Para hacer eso, necesita bloquear su enfoque en ciertas ventanas. En Windows, el control sobre este comportamiento se deja en gran medida a los desarrolladores de los programas individuales que utiliza.
No todos los desarrolladores toman las decisiones correctas cuando se trata de este tema.
Sé que esto es muy frustrante y molesto, pero no puedes tener tu pastel y comerlo también. Probablemente hay muchos casos a lo largo de su vida diaria en los que está perfectamente bien con el foco movido a un determinado elemento de la interfaz de usuario o una aplicación que solicita que el foco permanezca fijo en él. Pero la mayoría de las aplicaciones son algo iguales cuando se trata de decidir quién es el líder en este momento y el sistema nunca puede ser perfecto.
Hace un tiempo hice una extensa investigación para resolver este problema de una vez por todas (y fallé). El resultado de mi investigación se puede encontrar en la página del proyecto molesto .
El proyecto también incluye una aplicación que intenta repetidamente llamar la atención llamando:
Como podemos ver en este fragmento, mi investigación también se centró en otros aspectos del comportamiento de la interfaz de usuario que no me gustan.
La forma en que traté de resolver esto fue cargar una DLL en cada proceso nuevo y conectar las llamadas a la API que hacen que se activen otras ventanas.
La última parte es fácil, gracias a las impresionantes bibliotecas de enganche de API que existen. Usé la gran biblioteca mhook :
Desde mis pruebas en ese entonces, esto funcionó muy bien. Excepto por la parte de cargar la DLL en cada proceso nuevo. Como uno podría imaginar, eso no es nada que tomar demasiado a la ligera. Solía los AppInit_DLLs acercan entonces (que simplemente no es suficiente).
Básicamente, esto funciona muy bien. Pero nunca encontré el tiempo para escribir algo que inyecte correctamente mi DLL en nuevos procesos. Y el tiempo invertido en esto eclipsa en gran medida la molestia que me causa el robo de atención.
Además del problema de inyección de DLL, también hay un método de robo de foco que no cubrí en la implementación en Google Code. Un compañero de trabajo en realidad hizo una investigación adicional y cubrió ese método. El problema se discutió en SO: https://stackoverflow.com/questions/7430864/windows-7-prevent-application-from-losing-focus
fuente
jne
?En Windows 7, la
ForegroundLockTimeout
entrada del registro ya no está marcada, puede verificar esto con Process Monitor. De hecho, en Windows 7 no le permiten cambiar la ventana de primer plano. Vaya y lea sobre sus detalles , incluso ha estado allí desde Windows 2000.Sin embargo, la documentación apesta y se persiguen y encuentran formas de evitarlo .
Entonces, hay algo con errores
SetForegroundWindow
o funciones API similares ...La única manera de hacer esto correctamente es crear una pequeña aplicación que llame periódicamente
LockSetForegroundWindow
, prácticamente deshabilitando cualquier llamada a nuestra función API con errores.Si eso no es suficiente (¿otra llamada API defectuosa?) Puede ir aún más lejos y hacer un seguimiento de la API para ver qué está sucediendo, y luego simplemente enganchar las llamadas API en cada proceso, después de lo cual puede deshacerse de las llamadas que se equivocan el primer plano. Sin embargo, irónicamente, Microsoft desaconseja esto ...
fuente
Hay una opción en TweakUI que hace esto. Evita la mayoría de los trucos habituales que los desarrolladores de software dudosos emplean para forzar el enfoque en su aplicación.
Sin embargo, es una guerra de armas en curso, así que no sé si funciona para todo.
Actualización : Según EndangeredMassa , TweakUI no funciona en Windows 7.
fuente
Creo que puede existir cierta confusión, ya que hay dos formas de "robar el foco": (1) una ventana que se pone en primer plano, y (2) la ventana que recibe pulsaciones de teclas.
El problema al que se hace referencia aquí es probablemente el segundo, en el que una ventana reclama el foco al ponerse en primer plano, sin la solicitud o permiso del usuario.
La discusión debe dividirse aquí entre XP y 7.
Windows XP
En XP hay un hack de registro que hace que XP funcione igual que Windows 7 para evitar que las aplicaciones roben el foco:
HKEY_CURRENT_USER\Control Panel\Desktop
.ForegroundLockTimeout
y establezca su valor en hexadecimal en30d40
.Windows 7
(La discusión a continuación se aplica principalmente a XP también).
Por favor, comprenda que no hay forma en que Windows pueda bloquear totalmente las aplicaciones de robar el foco y permanecer funcional. Por ejemplo, si durante una copia de un archivo, su antivirus detectó una posible amenaza y le gustaría abrir una ventana emergente pidiéndole que tome medidas, si esta ventana está bloqueada, nunca entenderá por qué la copia nunca termina.
En Windows 7, solo hay una modificación posible en el comportamiento del propio Windows, que es utilizar los hacks de registro MS-Windows focus-sigue-mouse , donde el foco y / o activación siempre se dirige a las ventanas debajo del cursor. Se puede agregar un retraso para evitar que aparezcan aplicaciones en todo el escritorio.
Consulte este artículo: Windows 7: el desplazamiento del mouse activa la ventana: Habilitar .
De lo contrario, uno debe detectar y neutralizar el programa de culpabilidad: si esta es siempre la misma aplicación que está recibiendo el foco, entonces esta aplicación está programada para enfocar y evitar que esto se pueda hacer deshabilitando que se inicie con la computadora, o use alguna configuración proporcionada por esa aplicación para evitar este comportamiento.
Podría usar el script VBS incluido en el Código VB que identifica quién está robando el foco , que el autor usó para identificar al culpable como un actualizador de "llamada a casa" para un software de impresora.
Una medida desesperada cuando todo lo demás falla, y si ha identificado esta aplicación mal programada, es minimizarla y esperar que no se presente al frente. Una forma más fuerte de minimización es la bandeja usando uno de los productos gratuitos enumerados en Best Free Application Minimizer .
La última idea en el orden de la desesperación es fracturar su escritorio virtualmente usando un producto como Desktops o Dexpot , y hacer su trabajo en otro escritorio que no sea el predeterminado.
[EDITAR]
Como Microsoft retiró la Galería de archivos, aquí se reproduce el código VB anterior:
fuente
Alt-Tab
funciona; solo forzando el diálogo al frente.Alt+Tab
lista y, en mi experiencia, una ventana que tiene un diálogo modal abierto, no siempre (¿nunca?) muestra el diálogo modal conAlt+Tab
, especialmente si el diálogo nunca tuvo un cambio para enfocarse.:-|
Ghacks tiene una posible solución:
fuente
Inspirado por la respuesta de Der Hochstapler , decidí escribir un inyector DLL, que funciona con procesos de 64 y 32 bits y evita el robo de foco en Windows 7 o posterior: https://blade.sk/stay-focused/
La forma en que funciona es que busca ventanas recién creadas (usando
SetWinEventHook
) e inyecta DLL muy similar a la de Der Hochstapler en el proceso de la ventana, si aún no está presente. Descarga las DLL y restaura la funcionalidad original al salir.Según mis pruebas, hasta ahora funciona muy bien. Sin embargo, el problema parece ir más allá de las llamadas de aplicaciones
SetForegroundWindow
. Por ejemplo, cuando se crea una nueva ventana, se pone automáticamente en primer plano, lo que también interfiere con un usuario que escribe en otra ventana.Para lidiar con otros métodos de robo de foco, se requieren más pruebas y agradecería cualquier comentario sobre los escenarios donde está sucediendo.
fuente
Descubrí cómo evitar que la Barra de tareas muestre una ventana de destino recién activada después de activar, maximizar y enfocar programáticamente la ventana principal de ese proceso desde otro proceso. En primer lugar, hay muchas restricciones sobre si se permitirá esta operación.
Entonces, si el proceso de control está en primer plano, puede habilitar temporalmente otro proceso para robar completamente el primer plano llamando a AllowSetForegroundWindow con la identificación del proceso del proceso de destino. Luego, después de eso, el proceso de destino puede llamar a SetForegroundWindow en sí, utilizando su propio identificador de ventana, y funcionará.
Obviamente, esto requiere cierta coordinación entre los dos procesos, pero funciona, y si está haciendo esto para implementar una aplicación de instancia única que redirige todos los lanzamientos de Explorer-click en la instancia de aplicación existente, entonces ya estará tener una (por ejemplo) tubería con nombre para coordinar las cosas de todos modos.
fuente