Como é que os meus código funciona quando eu uso um MessageBox.Show () no meio, e não funciona sem ele?

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

  •  05-09-2019
  •  | 
  •  

Pergunta

Eu incorporado WebBrowser do .NET em uma forma que tem alguns outros botões.

A aplicação que estou desenvolvendo não usa um teclado, mas utiliza uma tela sensível ao toque. Então, ele realmente usa apenas o mouse. Para rolar a baixo webbrowser, fiz dois botões personalizados. Quando eu clicar nesses botões, deve enviar um "PageDown" stroke chave para o navegador e o navegador deve rolar para baixo.

Assim, o código no evento clique é a seguinte:

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

Onde theform 'é a forma e 'theBrowser' é a instância do navegador.

Então, quando eu clico no botão, nada acontece. Quando eu clicar sobre o navegador e clique no botão, ele funciona. Mas im dando-lhe concentrar certo? E eu dei a aplicação espaço suficiente para definir o foco?

Mas agora o que eu acho que é estranho. Quando eu colocar um MessageBox.Show ( "OLÁ"); no código, como este:

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

... ela não funciona imediatamente quando clico no botão.

Então a questão é: Por que esse código não trabalho quando eu deixar o MessageBox.Show (), mas faz quando eu uso o MessageBox.Show ()

?

Hope você pode ajudar, obrigado antecipadamente ...

Foi útil?

Solução

Para mim, esta parece ser a maneira errada de ir sobre isso.

Tente algo ao longo das linhas deste amostra C ++ ou esta C # amostra .

Pelo menos ser explícito sobre o HWND que você está enviando a mensagem para se você estiver indo para ser simulando teclas pressionadas.

Outras dicas

Sem entrar em se sua abordagem é correta. (E eu suspeito que não é).

Gostaria de apostar que você tem uma condição de corrida. O que significa que o controle de navegador precisa de mais tempo para carga e responder a eventos que você está deixando-o.

Então, quando você faz Message.Show, de repente, o segmento que você enviar os eventos é bloqueado e está deixando o intializing completo controle de navegador ou outra coisa.

É difícil saber de sua pergunta se você estiver executando em Mobile, ou desktop regular porque existem melhores abordagens para lidar com toque. Olhada Window7 Api para multi toque ou WPF 4.0 (que é compartilhada por superfície de toque SDK aswell).

Espero que ajude. Ariel

Pode ser que o controle de navegador ainda está carregando um documento e a caixa de mensagem lhe dá tempo suficiente para terminar. Se assim for, esperar até propriedade IsBusy do navegador é falsa ou usar o evento DocumentCompleted.

Eu não sei, mas, em geral, na minha experiência, é uma má idéia para tentar mudar o foco programaticamente como este, você sempre acabam em uma caça bug. Há muitas maneiras de obter janelas para rolar embora, então talvez você deve tentar outra coisa? Por exemplo JavaScript no navegador da web pode rolar a janela de forma eficaz.

Eu suspeito que você tem uma corrida aqui o que é feito em primeiro lugar. Concentrando-se o controle pode não ser instantânea e a combinação de teclas você enviar fui noutro local, enquanto que depois de fechar a caixa de mensagem do controle do navegador já está focado e recebe o seu toque de tecla.

Além disso, para citar uma nota do MSDN sobre Control.Focus () :

O foco é um método de baixo nível destina-se principalmente para os autores de controle personalizados. Em vez disso, os programadores de aplicativos devem usar a Selecione método ou o ActiveControl propriedade para controles filho, ou a Ativar método para formulários.

Então, usando um daqueles poderia ser melhor do que usar Focus ().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top