Como simular entrada do teclado para uma sessão de desktop remoto?
-
19-08-2019 - |
Pergunta
Estou tentando enviar entrada do teclado falso para um aplicativo que está sendo executado em uma sessão Remote Desktop. eu estou usando:
Byte key = Ord("A");
keybd_event(key, 0, 0, 0); // key goes down
keybd_event(key, 0, KEYEVENTF_KEYUP, 0); // key goes up
Agora, este código faz enviar o caractere "a" a qualquer janela local, mas não vai enviar para a janela de desktop remoto.
O que isto significa é que eu usar o Remote Desktop para conectar a um servidor, e eu, em seguida, abra o bloco de notas no servidor. Se eu soco manualmente teclas do teclado: eles aparecem na janela de edição de bloco de notas. Mas a entrada do teclado falso de keybd_event não causar "a" é a aparecer no bloco de notas.
Como posso programtically enviar entrada do teclado falso para um aplicativo em execução dentro de uma conexão de desktop remoto, a partir de uma aplicação em execução na máquina local?
Nitpickers Canto
Neste caso particular eu quero fazer isso becase eu estou tentando derrotar um idle-timeout. Mas eu poderia muito bem estar tentando
- realizar testes de automação de interface do usuário
- testes de estresse UI
- UI detecção de falhas testes
- testes de unidade de interface do usuário
- ensaios de entrada de dados de interface do usuário
- testes pintura UI testes de resiliência
- ou UI.
Em outras palavras, as minhas razões para querer que não são importantes
Nota: O tempo de espera pode ser de inatividade desktop remoto, ou talvez não. eu não sei, e isso não afeta minha pergunta.
Solução
Resposta ??h2>
Embora Microsft diz que você não precisa, e você não deve , enviar o código de OEM, você precisa enviar os códigos de verificação de OEM. Neste exemplo eu preciso enviar os códigos OEM varredura para
- Uma chave vai para baixo
- chave A sobe
Há um imagem de um gráfico em CodeProject que as listas a marca e quebrar códigos de digitalização para várias chaves:
No meu caso as chamadas originais para necessidade keybd_event de ser alterado para:
Byte key = Ord("A");
keybd_event(key, 0x1E, 0, 0); // key goes down
keybd_event(key, 0x9E, KEYEVENTF_KEYUP, 0); // key goes up
Eu testei isso, e ele funciona. Então está tudo bem.
Outras dicas
Pode ser que você pode executar um href="http://www.autoitscript.com/autoit3/" rel="nofollow noreferrer"> roteiro PsExec , um peso-leve telnet-substituição que permite executar processos em outro sistemas completos, com total interatividade para aplicativos de console, sem ter que instalar manualmente o software cliente.
(AutoIt é bem capaz de enviar qualquer sinal (chaves ou outros) a qualquer aplicação janela, e poderia ser lançado com PsExec na área de trabalho remota)
Um AutoIt script como KillSaver , por exemplo, é projetado para mover o mouse para evitar qualquer tempo ocioso prolongar em um computador!
Isso funcionou muito bem obrigado. A fim de obter o código de verificação do teclado pode-se usar:
int scan;
scan = MapVirtualKey(key & 0xff, 0);
keybd_event(key, scan, 0, 0); // key goes down
keybd_event(key, scan | 0x80, KEYEVENTF_KEYUP, 0); // key goes up
Você pode usar SendMessage (); É realmente uma muito melhor simulador para chaves. Bem, boa sorte nessa!