remote-desktop rdp sendkeys

remote desktop - ¿Alternativa a SendKeys cuando se ejecuta sobre Escritorio remoto?



remote-desktop rdp (4)

En mi caso, estaba usando sendkeys como parte de la automatización de prueba. No funcionaría desde mi máquina de compilación, donde el agente de compilación se ejecuta a través del protocolo de escritorio remoto. No estoy contento con eso, pero pude omitir esa prueba como parte de mis compilaciones automatizadas.

El uso de llamadas de Win32 para enviar mensajes de la ventana podría funcionar, si tengo tiempo puedo intentarlo algún día.

De todos modos, aquí está la comprobación para ver si el código actual se está ejecutando en una sesión de escritorio remoto:

System.Environment.GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-")

Tengo una aplicación que inyecta pulsaciones en las aplicaciones a través de SendKeys.

Desafortunadamente, la aplicación no funcionará cuando la estoy ejecutando a través de Escritorio remoto debido al problema bien conocido de que SendKeys no funciona con Escritorio remoto.

¿Alguien ha resuelto este problema antes o tiene alguna buena sugerencia sobre cómo resolverlo?


En mi caso, estuve utilizando exitosamente SendInput de WinAPI con códigos de escaneo de hardware. Parece que SendKeys asigna caracteres a los códigos de escaneo incorrectamente.


Puede solucionar el problema de RDP teniendo el escritorio siempre conectado antes de su uso (o configurado para inicio de sesión automático en cada inicio).

E incluso con el inicio de sesión automático, si alguna vez necesita acceso a un escritorio remoto para ejecutar la automatización o administrar el sistema, etc., el método preferido es usar VNC para el acceso remoto en lugar de RDP. El motivo es que VNC es multiplataforma y no se encontrará con este problema de RDP. VNC funciona como un relé de su escritorio real (sesión de consola RDP 0 o el "jefe" de la máquina), la desventaja es que solo se realiza una sesión remota a la vez (o todos comparten el mismo escritorio + teclado + mouse). VNC también funcionará para máquinas virtuales. Use VNC en lugar de RDP o acceso local (RDP) desde el software del administrador de la máquina virtual (VMWare / Hyper-V / Xen).

Lo único que hay que tener en cuenta con VNC es que el escritorio no esté configurado para bloquearse automáticamente en modo inactivo o protector de pantalla, lo que también puede impedir que se ejecuten las claves de envío y la automatización de GUI, así que asegúrese de deshabilitarlo. El protector de pantalla y el ahorro de energía del monitor están bien, solo que no hay bloqueo automático ni protección con contraseña.

NOTA: No estoy seguro, pero creo que ya que VNC transmite el escritorio "tal como está", es lo mismo que ejecutar de forma local desde el punto de vista de la aplicación / sistema, por lo que en teoría también debería poder engañar al sistema / aplicación. eso no permite SendKeys a través de RDP. No he tenido problemas al utilizar este método VNC para AutoIt + SendKeys, ya sea que esté conectado activamente a través de VNC o desconectado (las teclas de envío / automatización siguen funcionando después de la desconexión porque en el escritorio real, todavía está conectado, solo que VNC no activo).


SendKeys no es una buena opción debido principalmente a:

  • Solo puede enviar claves a la aplicación activa / enfocada, lo que nunca se garantiza que funcione porque la aplicación activa puede cambiar entre el momento en que se envían las claves.
  • RDP y muchas otras bibliotecas (por ejemplo, DirectX) las bloquean principalmente por razones de seguridad.

Mejores alternativas:

Código de muestra usando SendMessage :

HWND hwndNotepad = FindWindow(_T("Notepad"), NULL); HWND hwndEdit = FindWindowEx(hwndNotepad, NULL, _T("Edit"), NULL); SendMessage(hwndEdit, WM_SETTEXT, NULL, (LPARAM)_T("hello"));