Pregunta

Estoy haciendo que la ventana de otra aplicación sea lo más importante posible para garantizar que un clic en mi aplicación haga aparecer el cuadro de diálogo de la otra. El problema que tengo es que no vuelvo a enfocarme en mi aplicación después de la llamada. Si la otra aplicación tiene más ventanas, una de ellas termina con el foco y, de lo contrario, ninguna ventana (solo mirando la barra de tareas) se enfoca. ¿Dónde debo comenzar a investigar el problema?

Mi código para hacer que la otra aplicación sea superior es:

Process p = Process.GetProcessById(trackedProcessID);
IntPtr h = p.MainWindowHandle;
uint TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE | SWP_ASYNCWINDOWPOS;
SetWindowPos(h, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);

con constantes como

public static readonly uint SWP_NOMOVE = 0x0002;
public static readonly uint SWP_NOSIZE = 0x0001;
public static readonly uint SWP_ASYNCWINDOWPOS = 0x4000;
public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
¿Fue útil?

Solución

Relacionado: Comportamiento inesperado de Process.MainWindowHandle

Básicamente MainWindowHandle le ofrece la ventana más actual del proceso a pesar de lo que dice la documentación.

Eso explica por qué la ventana principal de tu otro proceso no se enfoca necesariamente.

Su otro problema es porque no está volviendo a enfocar su aplicación después de regalarla.

En realidad, el término correcto para lo que está haciendo es establecer orden z .

En lugar de intentar controlar el orden z, que no se puede garantizar, es mejor que envíe mensajes al otro proceso.

Otros consejos

¿Has probado SWP_NOACTIVATE?

[Solución real utilizada]

Hasta ahora, voy a enviar el identificador de ventana de la ventana de llamada a la aplicación de destino y hacer que vuelva a colocarlo en la parte superior cuando termine. Es un verdadero dolor, ya que tendré ~ 50 ventanas para tratar, pero parece estable. El siguiente enfoque, si esto resulta tener problemas, será volver a llamar a la aplicación de llamadas y pedirle que empuje la ventana al primer plano, pero prefiero no hacerlo, ya que presenta la posibilidad de que el usuario pueda hacer algo para la aplicación de llamada mientras el mensaje está en tránsito (solo es un problema si hay muchos mensajes en el mismo protocolo de transporte, lo que podría ocurrir)

No intente utilizar el identificador de la ventana entrante y establezca el elemento primario de cualquier ventana que se muestre en la aplicación de destino en ese identificador, solo hace que el cuadro de diálogo que se muestra aparezca dentro de los límites de la ventana de la aplicación de llamada y se recorta si es necesario. inútil

Muchas gracias por las respuestas anteriores a la pregunta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top