Prevenir 'A' de proceso de desove 'B' de proceso que luego aparece en la parte superior de lo que debería ser el “TopMost” Proceso de 'C'

StackOverflow https://stackoverflow.com/questions/1132831

Pregunta

Tengo una aplicación de Windows Forms que debe ser la más alta. He puesto mi forma de ser el más elevado y mi aplicación funciona como me gustaría que a excepción de en un caso.

No es una aplicación de 3 ª parte (referido como player.exe ) que muestra los archivos de película SWF en una parte de la pantalla que emergente en la parte superior de mi solicitud.

El uso de monitor de procesos determiné que player.exe llamadas de aplicación
flash.exe <PositionX> <PositionY> <Width> <Height> <MovieFile>
en mi caso:
flash.exe 901 96 379 261 somemovie.swf

Desde flash.exe se generó en un nuevo proceso después de que mi forma se ha establecido en el más elevado que aparece en la parte superior de mi solicitud.

Lo primero que hice fue hacer mi solicitud minimizar el player.exe ventana principal de la aplicación con la esperanza de que esto impediría el flash de aparecer también. Pero, por desgracia no es así ... incluso con la ventana minimizada cuando el destello de la película comienza se presenta en la posición de píxel (901,96). Luego trató de crear un temporizador para mantener al establecer la propiedad form.TopMost a verdaderos cada 10 ms. Este tipo de obras, pero aún ve un bache muy rápido del archivo SWF.

¿Hay algún tipo de llamada a la API de Windows que se puede utilizar para evitar temporalmente player.exe de desove procesos secundarios que son visibles? Admito que suena un poco descabellado. Pero, por curiosidad, si alguien más ha tenido un problema similar.


Adición:

Esta adición es proporcionar una respuesta a algunas de las sugerencias nos extienden en el post de Mathew continuación.

En la situación de emergencia se describe en los comentarios, me gustaría ver las posibles soluciones a lo largo de estas líneas:

  

1) ¿De qué manera la aplicación de terceros normalmente empezar y   ¿detenido? ¿Estoy autorizado para cerrarla   de la misma manera? Si se trata de un servicio, el   Administrador de control puede detenerlo.   Si se trata de una aplicación normal,   enviando una pulsación de tecla de escape (con   SendInput () tal vez) o WM_CLOSE   mensaje a su ventana principal puede trabajar.

La manera más fácil para cerrar la aplicación es a CTRL-ALT-DEL, y luego matar proceso. -O- La forma correcta es mantener ESC mientras hace clic en el botón izquierdo del ratón ... luego ingrese su nombre de usuario y contraseña, navegar de algún menú para detener el reproductor.

No hay ningún comando de pausa ... lo creas o no.

No creo que el uso de WM_CLOSE ayudará a reducir al mínimo ya que la aplicación no lo hace. Habría que matar el proceso también? Si no es así, ¿cómo volver a abrirlo.

  

2) Si no puedo cerrarlo bien, me es permitido matarlo? Si es así,   TerminateProcess () debería funcionar.

No puedo matar el proceso por dos razones. 1) Al relanzamiento es necesario proporcionar las credenciales de usuario / contraseña ... Puede haber una manera de evitar esto, ya que no le pide cuando la máquina se reinicia, pero ... 2) Cada vez que mato el proceso en el administrador de tareas < strong> no muere con gracia y le pregunta si desea enviar un informe de error .

  

3) Si que sea absolutamente necesario dejar el otro en marcha el proceso, me gustaría tratar   para ver si puedo programáticamente   invocar el cambio rápido de usuario para llevarme   a una sesión diferente (en el que hay   será sin ventanas más altas de la competencia).   No sé en qué parte del API para iniciar   Con este. (Peter Ruderman   sugiere SwitchDesktop () para este   propósito en su respuesta.)

Me puse muy emocionado por esta idea ... He encontrado este artículo en CodeProject que proporciona una gran cantidad de los métodos de la API de envoltura. Dejé de implementar porque Creo que para que el escritorio de trabajar debe tener explorer.exe corriendo (que yo no) .

Edit2 : Pensándolo bien ... tal vez no es necesario explorer.exe. Voy a darle una oportunidad y presentar un informe.

Edit3 : no ha podido obtener el código en ºen el artículo de trabajo. Tendrá que poner esto en espera por un momento.


respuesta Resumen

Como era de esperar, no hay una respuesta sencilla a este problema. La mejor solución sería problemático cambiar a un escritorio diferente cuando se necesita para garantizar no aparecerá nada sobre ella. Yo era incapaz de encontrar una sencilla aplicación C # de cambio de escritorios, que funcionó y tuve duda se avecina que sólo sería la apertura de un nuevo conjunto de gusanos, una vez que se puso en práctica. Por lo tanto, he decidido no aplicar el cambio de escritorios. Lo que encontrar una implementación en C ++ que funciona bien. Por favor, puesto de trabajo de escritorio virtual C # implementaciones para otros.

¿Fue útil?

Solución

Al establecer la propiedad TopMost (o añadir el estilo WS_EX_TOPMOST a una ventana) no lo hace único en el sistema. Cualquier número de ventanas más altas puede ser creado por cualquier número de aplicaciones; la única garantía es que todas las ventanas más altas serán atraídos 'por encima' todas las ventanas no más altas. Si hay dos o más ventanas más altas, del orden Z sigue siendo válida. Desde su descripción, sospecho que flash.exe también está creando una ventana superior.

Además de forzar periódicamente su ventana a la parte superior de la orden Z, creo que es poco lo que puede hacer. Se advierte, sin embargo, que este enfoque es peligroso: si dos o más ventanas están tratando al mismo tiempo de forzar a sí mismos a la parte superior de la orden Z, el resultado será un desastre parpadeo que el usuario probablemente tendrá que utilizar el administrador de tareas para escapar.

Le recomiendo que su programa no intenta interferir con otros procesos en el equipo (a menos que ese es su propósito explícito, por ejemplo, un administrador de tareas clon). El equipo pertenece al usuario, y él no puede valorar su programa más alto que todos los demás.

Adición:

En la situación de emergencia se describe en los comentarios, me gustaría ver las posibles soluciones a lo largo de estas líneas:

  1. ¿De qué manera la aplicación de terceros normalmente empezar y se detuvo? ¿Estoy autorizado para cerrarla de la misma manera? Si se trata de un servicio, el Administrador de control puede detenerlo. Si se trata de una aplicación normal, el envío de una pulsación de tecla de escape (con SendInput () tal vez) o WM_CLOSE mensaje a su ventana principal puede trabajar.

  2. Si no puedo cerrarlo bien, me es permitido matarlo? Si es así, TerminateProcess () debería funcionar.

  3. Si que sea absolutamente necesario dejar el otro en marcha el proceso, me gustaría probar para ver si puedo invocar mediante programación cambio rápido de usuario para que me llevara a una sesión diferente (en el que no habrá ventanas más altas de la competencia). No sé en qué parte del API para iniciar con éste. (Peter Ruderman sugiere SwitchDesktop () para este propósito en su respuesta.)

Otros consejos

Puede utilizar el clase de proceso de flash.exe iniciar directamente - y el uso de una adecuada ProcessStartInfo ajustes para mostrar la ventana en un estado oculto -. o con un WindowStyle de oculta o minimizada

También se puede considerar el uso de la SetWindowsHookEx API para interceptar las llamadas a la API de inicio del proceso, y cuando el proceso es flash.exe ejecutar algún código para restaurar la ventana para que la parte superior-la mayoría de estado.

La respuesta de Mateo es excelente, pero sospecha que puede estar haciendo la pregunta equivocada. ¿Por qué su aplicación necesidad a ser más alta? Si usted está tratando de crear un quiosco o algo así, entonces superior no es el camino a seguir.

Editar Después de leer su respuesta al comentario de Mateo, me gustaría sugerir la creación de un nuevo ordenador de sobremesa y el cambio a que antes de mostrar su alerta. (Ver CreateDesktop y SwitchDesktop en MSDN.)

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