none
Bloquear ação do usuário via teclado e mouse VBA RRS feed

  • Pergunta

  • Olá caros,

    Gostaria de saber se alguém aqui conhece uma forma de bloquear a ação do usuário via teclado e via mouse. Estou criando uma aplicação em VBA que interage com outros arquivos e aplicativos, abrindo-os e, por hora, realizando o envio de SendKeys. Dessa forma, gostaria de que o aplicativo que estão com AppActivate setado continuem assim e que o usuário espere até que toda a ação do VBA esteja completa.

    Um segundo ponto é: há alguma maneira de a aplicação que está com AppActivate setado fique em um segundo plano? Ex.: Manter o form do VBA em primeiro plano enquanto a mágica acontece, sem que o usuário perceba?

    Quaisquer contribuições são bem vindas.

    Desde já agradeço o apoio.

    sexta-feira, 17 de janeiro de 2014 13:44

Respostas

  • Procure se informar sobre a API BringWindowtoTop para manter o foco no puTTy.

    Funciona assim: você usa a API FindWindow para descobrir o handle da janela do puTTy e, tendo esse valor, usa a API BringWindowtoTop para manter ela como aplicação ativa.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    quarta-feira, 22 de janeiro de 2014 20:20
    Moderador

Todas as Respostas

  • Sobre sua primeira pergunta: não é possível bloquear o mouse e nem o teclado. O melhor que você pode fazer é colocar um aviso na tela solicitando ao usuário não interferir na execução da macro e tentar enxugar o máximo possível o número de SendKeys que você usa.

    Segunda questão: você pode alterar a propriedade Application.Visible para False no início da macro, mas depois não esquecer de retornar para True ao término.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    domingo, 19 de janeiro de 2014 15:31
    Moderador
  • Dim TaskID2 As Long
        TaskID2 = Shell("C:\Users\usuário\Desktop\putty.exe", 6)
        
        
        Application.Visible = False
        
        AppActivate TaskID2
        Application.Wait Now() + TimeValue("00:00:01")
        Application.SendKeys "IP address"
        Application.Wait Now() + TimeValue("00:00:01")
        Application.SendKeys "{TAB}"
        Application.Wait Now() + TimeValue("00:00:01")
        Application.SendKeys "{TAB}"
        Application.Wait Now() + TimeValue("00:00:01")
        Application.SendKeys "{LEFT}"
        Application.Wait Now() + TimeValue("00:00:01")
        Application.SendKeys "{LEFT}"
        Application.Wait Now() + TimeValue("00:00:01")
        Application.SendKeys "~"
        Application.Wait Now() + TimeValue("00:00:01")
        Application.SendKeys "Teste"
        
        Application.Visible = True

    Olá Felipe,

    Sobre a primeira pergunta: realmente, procurei em diversos locais mas não encontrei a resposta em nenhum. No lugar disso, encontrei uma API BlockInput que realiza o bloqueio da entrada de dados (MOUSE e TECLADO) na aplicação. Mas isso não é o suficiente... Apenas para exemplificar: o usuário deve ver apenas um form do VBA, no entanto, este form do VBA irá chamar uma instância do programa putty.exe através do comando shell do VBA. A seguir o VBA irá interagir com o aplicativo putty através de SendKeys, ou seja, o aplicativo deverá ficar o focus nele para funcionar o SendKeys (o usuário não poderá remover este foco). Minha ideia agora com o BlockInput é manter o mouse em cima do form até que a tarefa de background com o putty termine. Tem alguma ideia de como fazer isto? Estou completamente estagnado aqui. :(

    Sobre a segunda pergunta: apliquei o application.visible = false, mas o putty continua surgindo em cima da minha form. Estou fazendo algo errado? Segue abaixo meu código de teste:

    segunda-feira, 20 de janeiro de 2014 18:07
  • Antes de responder sua pergunta, vamos fazer uma pausa e tentar resolver esse problema sem usar o SendKeys.

    Sugiro que você preencha o IP, nome do usuário, senha ou seja lá o que for do PuTTy através de uma linha de comando. Então, você a função Shell com argumentos no putty.exe.

    Fiz uma pesquisa rápida e vi que isso é possível: http://etherealmind.com/putty-command-line/


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    segunda-feira, 20 de janeiro de 2014 21:09
    Moderador
  • Oi Felipe,

    Obrigado pela resposta, foi muito útil... Apesar de estar utilizando tanto o protocolo SSH, quanto o protocolo TELNET (este não aceita o envio de senha através de comandos por ser um protocolo não confiável), já consigo setar a conexão, indo para a famosa telinha preta :) (CLI interface). Funcionou como eu queria quando setei a conexão como vbHide (opção 6) e ativei a variável que chamava o shell (o application.visible = false estava escondendo o form mesmo).

    Apesar dessa configuração ter funcionado, o BlockInput não chegou ao resultado que eu queria, pois, mesmo clicando e não surtindo efeito, ele tira o foco da minha aplicação putty e sendkeys envia as teclas para o form, causando um resultado desastroso. Poderia mandar um appactivate antes de cada comando sendKeys, mas esta configuração ainda assim seria arriscada.

    Alguém tem alguma ideia para me socorrer?

    quarta-feira, 22 de janeiro de 2014 19:37
  • Procure se informar sobre a API BringWindowtoTop para manter o foco no puTTy.

    Funciona assim: você usa a API FindWindow para descobrir o handle da janela do puTTy e, tendo esse valor, usa a API BringWindowtoTop para manter ela como aplicação ativa.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    quarta-feira, 22 de janeiro de 2014 20:20
    Moderador