usar teclas teclado tecla simular presionar windows automation timeout remote-desktop

windows - teclas - ¿Cómo simular la entrada del teclado en una sesión de escritorio remota?



simular teclado c# (4)

Puede ser que pueda ejecutar un script autoit con PsExec , un sustituto telnet liviano que le permite ejecutar procesos en otros sistemas, completo con interactividad completa para aplicaciones de consola, sin tener que instalar manualmente el software del cliente.

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

Un script de AutoIt como KillSaver , por ejemplo, está diseñado para mover el mouse y evitar cualquier tiempo de inactividad prolongado en una computadora.

Encontré mi propia respuesta. Si alguien puede copiarlo / pegarlo en una respuesta para que pueda marcarlo como la respuesta, y responder esta pregunta, para sacarlo de la lista no respondida, lo agradecería.

Estoy intentando enviar una entrada de teclado falsa 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 Escritorio remoto para conectarme a un servidor, y luego abro el Bloc de notas en ese servidor. Si pinchar teclas manualmente en el teclado: aparecen en la ventana del editor del Bloc de notas. Pero la entrada falsa del teclado de keybd_event no causa que aparezcan "a" en el Bloc de notas.

¿Cómo puedo enviar programáticamente una entrada de teclado falsa 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?

Nitpickers Corner

En este caso particular, quiero hacer esto porque estoy tratando de vencer a un tiempo de inactividad. Pero podría intentarlo también

  • realizar pruebas de automatización de UI
  • Pruebas de estrés UI
  • Pruebas de detección de fallas de UI
  • Pruebas de unidad UI
  • Pruebas de entrada de datos UI
  • Pruebas de pintura UI
  • o pruebas de resilencia UI.

En otras palabras, mis razones para quererlo no son importantes

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


Podría usar SendMessage (); Realmente es un simulador mucho mejor para las llaves. Bueno, buena suerte en esto!


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


Responder

Aunque Microsft dice que no necesita, y no debería , enviar 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 exploración de creación y corte para varias claves:

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.