Pregunta

Estoy intentando enviar entradas de teclado falsas a una aplicación que se ejecuta en una sesión de Escritorio remoto. estoy usando:

Byte key = Ord("A");

keybd_event(key, 0, 0, 0); // key goes down
keybd_event(key, 0, KEYEVENTF_KEYUP, 0); // key goes up

Ahora este código envía el carácter " a " a cualquier ventana local, pero no se enviará a la ventana del escritorio remoto.

Lo que eso significa es que uso el Escritorio remoto para conectarme a un servidor y luego abro el Bloc de notas en ese servidor. Si presiono manualmente las teclas del teclado: aparecen en la ventana del editor del Bloc de notas. Pero la entrada falsa de teclado de keybd_event no causa que aparezcan " a " en el Bloc de notas.

¿Cómo puedo enviar mediante programación entradas de teclado falsas a una aplicación que se ejecuta dentro de una conexión de escritorio remoto, desde una aplicación que se ejecuta en la máquina local?


Esquina Nitpickers

En este caso particular, quiero hacer esto porque estoy tratando de vencer un tiempo de inactividad. Pero bien podría estar intentando

  • realizar pruebas de automatización de la interfaz de usuario
  • Pruebas de esfuerzo de IU
  • Pruebas de detección de fallos de IU
  • Pruebas de unidad de IU
  • Pruebas de entrada de datos de IU
  • Pruebas de pintura de IU
  • o pruebas de resistencia de IU.

En otras palabras, mis razones para quererlo no son importantes

Nota: el tiempo de espera puede ser debido a la inactividad del escritorio remoto, o tal vez no. No lo sé, y no afecta a mi pregunta.

¿Fue útil?

Solución

Respuesta

Aunque Microsft dice que no es necesario, y no debe , envíe el código OEM, debe enviar los códigos de escaneo OEM. En este ejemplo, necesito enviar los códigos de escaneo OEM para

  • la tecla A baja
  • la tecla A sube

Hay una imagen de un gráfico en CodeProject que enumera los códigos de escaneo de hacer y romper para varias teclas:

texto alternativo ??

En mi caso, las llamadas originales a keybd_event deben cambiarse a:

Byte key = Ord("A");

keybd_event(key, 0x1E, 0, 0); // key goes down
keybd_event(key, 0x9E, KEYEVENTF_KEYUP, 0); // key goes up

probé esto, y funciona. Entonces todo está bien.

Otros consejos

Es posible que pueda ejecutar una secuencia de comandos autoit con PsExec , un reemplazo ligero de Telnet que le permite ejecutar procesos en otros sistemas, completos con interactividad total para aplicaciones de consola, sin tener que instalar manualmente el software del cliente.

(AutoIt es bastante capaz de enviar cualquier señal (teclas u otra) a cualquier aplicación de ventana, y podría iniciarse con PsExec en el escritorio remoto)

Se ha diseñado un script AutoIt como KillSaver , por ejemplo. mover el mouse para evitar prolongar el tiempo de inactividad en una computadora

Esto funcionó muy bien, gracias. Para obtener el código de escaneo del teclado, se puede 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

Puede usar SendMessage (); Realmente es un simulador de teclas mucho mejor. Bueno, buena suerte en esto!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top