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.

Cómo detectar la conexión y desconexión principal del teclado en Windows

Estoy trabajando en una aplicación que utiliza las API de ventana y entrada directa de Window.

Puedo obtener la entrada sin demasiada dificultad y en este momento estoy tratando de detectar cuándo los dispositivos se conectan o desconectan de la aplicación. Para hacerlo, estoy escuchando WM_INPUT_DEVICE_CHANGE y usando GetRawInputDeviceInfo() para obtener información del dispositivo.

Mi problema actual es que, cuando tengo un ratón y un teclado conectados, el sistema operativo detecta tres dispositivos: dos teclados y un ratón. El ratón funciona bien, pero debido a que tengo dos teclados diferentes, no puedo identificar cuál es el “principal”. Cuando se desconecta el ratón o el teclado, se elimina uno de los dispositivos de teclado. Para no tener teclados, todos los dispositivos deben estar desconectados.

¿Existe alguna forma sencilla de detectar cuál de los teclados es el “principal”? ¿O no existe ningún concepto de un teclado “principal” en esta API?

En este momento, tengo las siguientes “soluciones” en mente:

  • La primera sería almacenar el identificador del dispositivo cuando se presiona una tecla y mantenerlo como el teclado principal, pero esto suena un poco “poco ortodoxo”.
  • La segunda sería intentar diferenciar el teclado principal en función del número de teclas. El problema es que también parece un poco “poco ortodoxo” ya que los teclados pueden variar fácilmente en el número de teclas.

Aunque no considero que sea necesario, proporciono un poco de código sobre cómo estoy verificando el estado de conexión y desconexión de los dispositivos, solo para completar.

// Leer LPARAM de WM_INPUT_DEVICE_CHANGE y obtener la información.
HANDLE DeviceHandle = (HANDLE)LParam;
bool bIsConnected = WParam == GIDC_ARRIVAL;
if (!bIsConnected)
return;

// Obtener los datos del dispositivo.
RID_DEVICE_INFO DeviceInfoData;
UINT SizeData = sizeof(RID_DEVICE_INFO);
UINT DeviceResult = GetRawInputDeviceInfo((void*)LParam, RIDI_DEVICEINFO, &DeviceInfoData, &SizeData);

// Lanzar cualquier callback basado en el tipo de dispositivo leído desde la variable dwType dentro de DeviceInfoData.

Muchas gracias 🙂

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para identificar el teclado “principal” con las API de ventanas y entrada en bruto de Windows

    Desafortunadamente, no existe un concepto de teclado “principal” dentro de las API de ventanas y entrada en bruto de Windows. Sin embargo, como se mencionó, existen algunas soluciones “chapuceras” que podrían funcionar potencialmente:

    1. Almacena el identificador del dispositivo cuando se presiona una tecla y mantenlo como el teclado principal. Esto puede funcionar, pero no es infalible, ya que se podría utilizar un teclado diferente para otras tareas y el identificador podría cambiar si el dispositivo se desconecta y se vuelve a conectar.
    2. Intenta diferenciar el teclado “principal” según el número de teclas. Esta solución tampoco es infalible, ya que los modelos de teclado pueden variar en el número de teclas.

    En última instancia, la mejor solución sería rediseñar la aplicación para eliminar la dependencia de identificar un teclado específico como el “principal”. La aplicación podría procesar la entrada de cualquier dispositivo de teclado conectado sin necesidad de diferenciar entre ellos.

Comments are closed.