Pregunta

Estoy tratando de utilizar el código de este artículo que le permite saber cuando su aplicación está inactivo ..

Este código funciona muy bien si su aplicación tiene una sola forma. Se llama a Application2.Run(myOnlyForm) en él y todos los mensajes son enrutados a través de los filtros en Application2.

Sin embargo, si en cualquier momento se llama a mySecondForm.ShowDialog() que el diálogo no consigue sus mensajes filtra a través de Application2.

¿Hay alguna manera (con a efectos secundarios negativos) para obtener los mensajes en mySecondForm que pasar por los filtros de eventos `Application2' ?

He intentado:

  1. Cambiar mySecondForm.ShowDialog a Application2.Run(mySecondForm).
    • Esto hace que la ventana de arriba no se limpia cuando se sale del ámbito y de no mostrar cuando sea necesario.
  2. Cambiar mySecondForm.ShowDialog a Application2.ShowDialog(mySecondForm).
    • Esto hace que el menú principal en mySecondForm de no trabajo (clic no tiene ningún efecto, solo emite un pitido).
      • Esto parece como el que debería usar, pero que tipo de necesidad de tener menús en mis pantallas. Parece que este es un común problema con OpenNETCF.
      • El elemento de menú no está roto. Usando la tecla de acceso directo para el menú todavía funciona. Simplemente pulsando el menú no funciona.
  3. Cambio de mySecondForm.ShowDialog a Application2.ShowDialog(mySecondForm, true) (TRUE = limpiar el cuadro de diálogo).
    • Esto no funciona porque necesito el acceso al cuadro de diálogo después de que se cierra algunas veces.

Lo ideal sería que me gustaría una manera de adjuntar un formulario para las capacidades de mensajes de Application2.

Pero Doy la bienvenida a cualquier sugerencia.


Editar: Sobre la base de la sugerencia de ctacke esto es lo que he hecho:

public static DialogResult ShowDialog2(this Form form)
{
    //form.Activated += InsertMenu;
    //Application2.ShowDialog(form);
    form.Show();
    try
    {
        do
        {
            Application2.DoEvents();
        } while (form.Visible);
    }
    catch (ObjectDisposedException)
    {
        // This just means that the form was closed.  Not a big deal.
    }
    return form.DialogResult;

}

Me acaban de llamar ShowDialog2 en lugar de ShowDialog

¿Fue útil?

Solución

Me puede explicar el comportamiento, aunque quizás no ofrezca una solución directa.

Cuando se llama a Mostrar en el cualquier Formulario, eventos del formulario conseguir manejado por el suministro de mensajes por defecto (que se hace configurado con la llamada a Run). Cuando se llama a ShowDialog, el formulario de destino tiene su propia, suministro de mensajes por separado.

Ahora el filtro que ha añadido reside en la bomba principal mensaje y que está buscando en todos los mensajes allí, pero las elude llamada ShowDialog eso -. Envían mensajes al cuadro de diálogo nunca alcanzará el filtro

Ahora que hicimos añadir la llamada Application2.ShowDialog como un intento de solucionar este problema, pero para ser honesto, mientras escribía toda la implementación Application.Run/IMEssageFilter, que no hice la ShowDialog Solución del problema y realmente don' t sabe lo bien que se implementó. Sobre la base de su informe de que me arriesgaría a decir de "no muy bien", aunque en realidad no es un problema sencillo de resolver. La raíz de este problema es que el SDF no controla lo que sucede en el BCL cuando se llama Show y ShowDialog - simplemente estamos tratando de sentarse encima de ella y proporcionar el mejor comportamiento posible. En este caso es problemático.

Puede usted, por casualidad, no utilizar una llamada a ShowDialog, sino que sólo tiene que utilizar Mostrar junto con algo así como mantener el formulario de nivel superior? Esto permitiría que el filtro para obtener todos los mensajes del pseudo-diálogo. La otra opción que se me ocurre de improviso correcta sería una clase base para los diálogos que se notifique de vuelta al mecanismo de filtro, pero que empieza a ser verdadero reto para el control.

Otros consejos

Perdón por preguntar, pero ¿por qué vas a través de toda esta cantidad insana de problemas por algo este sencillo? Mirando el artículo se enlazó, lo único que hace es iniciar un temporizador y se restablece cada evento WM_KEYUP, WM_MOUSEMOVE o WM_LBUTTONUP.

Puede lograr lo mismo o anulando WndProc PreProcessMessage en su forma y dejar que se haga lo restablecimiento del temporizador. Usted puede incluso hacer una forma de base (*) que hace que el temporizador / restablecer cosa y obtener todas sus formas de la misma. Y para una verdadera solución global, hacer que el temporizador estático.

(*) No se debe marcar como abstracto o el diseñador de formas lanzará un berrinche.

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