Come mai il mio codice funziona quando uso un MessageBox.Show () in mezzo, e non funziona senza di essa?

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

  •  05-09-2019
  •  | 
  •  

Domanda

ho inserito del browser web di .NET in una forma che ha alcuni altri tasti.

L'applicazione che sto sviluppando non utilizzare una tastiera, ma dotato di touchscreen. Così è in realtà utilizza solo il mouse. Per scorrere il browser web verso il basso, ho fatto due pulsanti personalizzati. Quando clicco quei bottoni, dovrebbe inviare un "PageDown" colpo chiave per il browser e il browser deve scorrere verso il basso.

Quindi, il codice a evento click è il seguente:

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

Dove 'theForm' è la forma e 'theBrowser' è l'istanza del browser.

Così, quando si fa clic sul pulsante, non succede nulla. Quando ho clic sul browser e fare clic sul pulsante, funziona. Ma im dandogli fuoco giusto? E ho dato l'applicazione di spazio sufficiente per impostare la messa a fuoco?

Ma ora quello che penso è strano. Quando ho messo un MessageBox.Show ( "CIAO"); nel codice, in questo modo:

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

... funziona immediatamente quando si fa clic sul pulsante.

Quindi la domanda è:? Perché questo codice non funziona quando lascio la MessageBox.Show (), ma lo fa quando faccio usare il MessageBox.Show ()

La speranza si può aiutare, grazie in anticipo ...

È stato utile?

Soluzione

A me questo sembra il modo sbagliato per essere in corso su questo.

Prova qualcosa sulla falsariga di questo C ++ campione o questo C # esempio .

almeno essere esplicita circa l'HWND si sta inviando il messaggio, se avete intenzione di essere la simulazione di tasti premuti.

Altri suggerimenti

Senza entrare in se il vostro approccio è corretto. (E ho il sospetto che non lo è).

Vorrei scommettere che si dispone di una condizione di competizione. Il che significa che il controllo del browser ha bisogno di più tempo per caricare e rispondere agli eventi che si sta lasciando.

Quindi, quando si fa Message.Show, improvvisamente il filo che si inviano gli eventi è bloccata e si sta lasciando il controllo del browser INIZIALIZZA completa o qualcosa d'altro.

E 'difficile sapere dalla tua domanda se è in esecuzione sul cellulare, o un desktop normale, perché ci sono gli approcci migliori per affrontare con tatto. Guardate Window7 Api per il multi touch o WPF 4.0 (che è condiviso da Surface SDK tocco lontato).

La speranza che aiuta. Ariel

E 'possibile che il controllo del browser è ancora carico di un documento e la finestra di messaggio dà abbastanza tempo per terminare. In tal caso, attendere fino proprietà IsBusy del browser è falso o utilizzare l'evento DocumentCompleted.

Non lo so, ma in generale nella mia esperienza è una cattiva idea per cercare di cambiare la messa a fuoco a livello di codice in questo modo, si finisce sempre a caccia di bug. Ci sono molti modi per ottenere le finestre per scorrere, però, quindi forse si dovrebbe provare qualcosa di diverso? Per esempio JavaScript nel browser web può scorrere in modo efficace la finestra.

Ho il sospetto che si dispone di una gara qui ciò che viene fatto prima. Messa a fuoco il controllo potrebbe non essere istantanea e la sequenza di tasti si invia andato altrove, mentre dopo la chiusura della finestra di messaggio il controllo del browser è già concentrato e ottiene la sua sequenza di tasti.

Inoltre, per citare una nota da MSDN su Control.Focus () :

  

Focus è un metodo a basso livello destinato principalmente per gli autori di controllo personalizzati. Invece, i programmatori di applicazioni dovrebbero utilizzare il Selezionare metodo o la ActiveControl immobili per controlli figlio, o il Attiva metodo per la forme.

Quindi, utilizzando uno di questi potrebbe essere migliore di utilizzare Focus ().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top