Cómo adjuntar mensajes desde un formulario se muestra con ShowDialog a Application2?
-
29-09-2019 - |
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:
- Cambiar
mySecondForm.ShowDialog
aApplication2.Run(mySecondForm)
.- Esto hace que la ventana de arriba no se limpia cuando se sale del ámbito y de no mostrar cuando sea necesario.
- Cambiar
mySecondForm.ShowDialog
aApplication2.ShowDialog(mySecondForm)
.- Esto hace que el menú principal en
mySecondForm
de no trabajo (clic no tiene ningún efecto, solo emite un pitido).
- Esto hace que el menú principal en
- Cambio de
mySecondForm.ShowDialog
aApplication2.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
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.