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.

Foi útil?

Solução

Resposta

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:

text alt

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!

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