Ejecutando un programa que envía pulsaciones de teclas en una sesión de RDP.
Tengo un programa en C++ que simula una pulsación de una tecla hacia abajo y una pulsación de una tecla hacia arriba cada varios minutos. El programa es básicamente una aplicación de consola y lo ejecuto, y presionará la tecla especificada donde sea que esté el enfoque actual, no necesariamente dentro de la propia aplicación.
Hago esto utilizando SendInput
.
El mismo programa no funciona cuando me conecto a un equipo mediante RDP y ejecuto el programa directamente en el host remoto. Mi búsqueda de una respuesta me llevó a conceptos como los códigos de escaneo y la asignación de teclas, pero no estoy seguro si estos son específicos de mi problema.
Mi código original está abajo. ¿Cómo puedo editarlo para que funcione al lanzar el programa en una sesión de RDP?
INPUT inputs[2] = {};
ZeroMemory(inputs, sizeof(inputs));
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wVk = VK_F22;
inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wVk = VK_F22;
inputs[1].ki.dwFlags = KEYEVENTF_KEYUP;
UINT uSent = SendInput(ARRAYSIZE(inputs), inputs, sizeof(INPUT));
davy.ai
Una opción para hacer que el programa funcione al iniciarlo en una sesión RDP es modificarlo para que use códigos de escaneo en lugar de códigos de tecla virtual. Esto significa reemplazar el miembro
wVk
de la estructuraKEYBDINPUT
conwScan
y configurar el miembrodwFlags
comoKEYEVENTF_SCANCODE
en lugar deKEYEVENTF_UNICODE
.A continuación se muestra un ejemplo de código actualizado que utiliza códigos de escaneo:
“`c++
INPUT inputs[2] = {};
ZeroMemory(inputs, sizeof(inputs));
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wScan = MapVirtualKey(VK_F22, MAPVK_VK_TO_VSC);
inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wScan = MapVirtualKey(VK_F22, MAPVK_VK_TO_VSC);
inputs[1].ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE;
UINT uSent = SendInput(ARRAYSIZE(inputs), inputs, sizeof(INPUT));
Este código se puede agregar antes del código de envío de eventos de entrada, y permitiría que el programa envíe eventos de entrada a la ventana activa incluso cuando se ejecuta en una sesión RDP.