¿Cómo es que mi código funciona cuando se utiliza un MessageBox.Show () en el medio, y no funciona sin él?

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

  •  05-09-2019
  •  | 
  •  

Pregunta

I incrustado WebBrowser de .NET en una forma que tiene algunos otros botones.

La aplicación que estoy desarrollando no utiliza un teclado, sino que utiliza una pantalla táctil. Lo que en realidad sólo utiliza el ratón. Para desplazarse por el navegador web abajo, hice dos botones personalizados. Cuando hago clic en los botones, se debe enviar un "AvPág" golpe de tecla en el navegador y el navegador debe desplazarse hacia abajo.

Así que el código en el evento de clic es el siguiente:

        theForm.Activate();
        Application.DoEvents();
        theBrowser.Focus();
        Application.DoEvents();
        SendKeys.Send(key);

¿Dónde theForm 'es la forma y 'theBrowser' es la instancia del navegador.

Así que cuando hago clic en el botón, no pasa nada. Cuando por primera vez clic en el navegador y, a continuación, haga clic en el botón, funciona. Pero im dándole enfoque correcto? Y le he dado la aplicación de suficiente espacio para ajustar el enfoque?

Pero ahora lo que pienso que es extraño. Cuando pongo un MessageBox.Show ( "Hola"); en el código, por ejemplo:

    theForm.Activate();
    Application.DoEvents();
    theBrowser.Focus();
    MessageBox.Show("HELLO");
    Application.DoEvents();
    SendKeys.Send(key);

... que funciona inmediatamente al hacer clic en el botón.

Así que la pregunta es: ¿Por qué este código no funciona cuando deje la MessageBox.Show (), pero lo hace cuando hago uso de la MessageBox.Show ()

La esperanza puede ayudar, gracias de antemano ...

¿Fue útil?

Solución

Para mí esto se parece a la forma equivocada de estar pasando por esto.

Trate algo en la línea de este C ++ muestra o esta C # muestra .

Al menos ser explícito sobre el HWND que está enviando el mensaje a si va a ser la simulación de pulsaciones de teclas.

Otros consejos

Sin entrar en si su enfoque es correcto. (Y sospecho que no lo es).

Me gustaría apostar que usted tiene una condición de carrera. Lo cual significa que el control de explorador necesita más tiempo para cargar y responder a eventos de lo que está dejando a él.

Así que cuando lo hace Message.Show, de pronto el hilo que envía los eventos se bloquea y se está dejando el control de explorador intializing completa o algo más.

Es difícil saber de su pregunta si se está ejecutando en el escritorio normal móvil, o porque hay mejores enfoques para tratar con tacto. Mira Window7 API para multi touch o WPF 4.0 (que es compartida por superficie táctil SDK aswell).

Espero que ayude. Ariel

Puede ser que el control de explorador todavía está cargando un documento y el cuadro de mensaje le da suficiente tiempo para terminar. Si es así, espere hasta que la propiedad IsBusy del navegador es falsa o utilizar el evento DocumentCompleted.

No sé, pero, en general, en mi experiencia, es una mala idea para tratar de cambiar el foco mediante programación de este tipo, que siempre terminan en una caza de errores. Hay un montón de maneras de conseguir ventanas para desplazarse embargo, por lo que tal vez debería probar otra cosa? Por ejemplo JavaScript en el navegador web puede desplazar la ventana de manera efectiva.

Me sospecha que tiene una carrera aquí lo que se hace por primera vez. Centrándose el control podría no ser instantánea y la pulsación de tecla se envía fuimos a otro lado, mientras que después de cerrar el cuadro de mensaje el control de explorador ya está centrado y obtiene su pulsación.

Además, para citar una nota de MSDN sobre Control.Focus () :

  

El enfoque es un método de bajo nivel destinado principalmente a los autores el control personalizado. En su lugar, los programadores de aplicaciones deben utilizar el Seleccionar método o la ActiveControl propiedad para el niño controla, o la Activar método para formas.

Así, utilizando uno de los mejores que podría ser el uso de enfoque ().

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