Estoy tratando de encontrar una forma confiable de activar/establecer el foco en una ventana de una aplicación externa usando C#. Actualmente estoy tratando de lograr esto usando las siguientes llamadas a la API de Windows:¿Hay alguna manera confiable de activar/establecer el foco en una ventana usando C#?
SetActiveWindow(handle);
SwitchToThisWindow(handle, true);
Anteriormente también tenían ShowWindow(handle, SW_SHOWMAXIMIZED);
ejecutar antes de que los otros 2, pero que eliminarlo porque estaba causando un comportamiento extraño.
El problema que tengo con mi implementación actual es que ocasionalmente el foco no se configurará correctamente. La ventana se volverá visible, pero la parte superior seguirá apareciendo atenuada como si no estuviera enfocada.
¿Hay alguna manera de hacer esto de manera confiable que funcione el 100% del tiempo, o el comportamiento incoherente es un efecto secundario del que no puedo escapar? Por favor, avíseme si tiene alguna sugerencia o implementación que siempre funcione.
Tu publicación fue muy informativa. Muchas gracias. Intentaré esto tan pronto como tenga la oportunidad de hacerlo. Tengo las firmas de P/Invoke, nunca entendí realmente la imagen completa detrás de las colas de entrada, pero lo pones muy claramente. :) – gtaborga
¡Gracias! Acabo de terminar de escribir una aplicación simple que es útil para teclas rápidas, llamada OpenOrSwitchTo. Básicamente, cuando se invoca con un nombre de exe (OpenOrSwitchTo.exe c: \ path \ to \ someapp.exe) si se está ejecutando someapp.exe, cambiará a él para que pueda comenzar a usarlo, y si no, se iniciará alguna aplicación. .exe. Intenté al menos media docena de métodos para cambiar a la ventana (SwitchToThisWindow, ShowWindow, BringWindowToTop, SetForegroundWindow, etc.). Su código finalmente funcionó, con una llamada rápida a ShowWindow para restaurar la ventana si se minimizaba primero. – iano
Para mí (Windows 7), la solución con 'AttachThreadInput()' no funciona.Resolví el problema al permitir que el _otro hilo_ estableciera su ventana de propietario en el _camino corriente_, entonces simplemente puedo 'SetActiveWindow()'. Ver mi publicación en el blog http://code.fitness/post/2017/09/how-to-activate-window-of-foreign-process.html –