es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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));
Tags:  , , ,

Answer

  1. Avatar for 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 estructura KEYBDINPUT con wScan y configurar el miembro dwFlags como KEYEVENTF_SCANCODE en lugar de KEYEVENTF_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));


    La función `MapVirtualKey` se utiliza para convertir el código de tecla virtual en un código de escaneo, que luego se puede usar con `wScan`. También se agrega la marca `KEYEVENTF_SCANCODE` al miembro `dwFlags` al enviar el evento de liberación de la tecla. Otro problema posible al ejecutar el programa en una sesión RDP es que es posible que no tenga el enfoque de entrada. En ese caso, puede ser necesario utilizar la función `AttachThreadInput` para adjuntar el hilo de entrada de la ventana objetivo antes de enviar eventos de entrada. ```c++ // Primero encontrar la ventana con enfoque de entrada HWND hWndFocus = GetForegroundWindow(); // Luego obtener el ID de hilo de esa ventana DWORD dwThreadID; dwThreadID = GetWindowThreadProcessId(hWndFocus, NULL); // Adjuntar el hilo de entrada de la ventana objetivo AttachThreadInput(GetCurrentThreadId(), dwThreadID, TRUE); // Enviar eventos de entrada como antes, luego separar el hilo de entrada AttachThreadInput(GetCurrentThreadId(), dwThreadID, FALSE);

    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.

Comments are closed.