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 🙂
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:
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.