en concreto estoy utilizando el evento Keypress.
Puedes hacerlo mediante la detección genérica de la entrada del teclado (RAW Input), pero requiere la implementación de una lógica algo tediosa (o aburrida), primero debes documentarme bastante (sobre todos los conceptos, mensajes, y estructuras que no mencionaré aquí abajo) y realizar mucho P/Invoking en tu código.
1) Obten los dispositivos de teclado/usb con la función GetRawInputDeviceList:
https://msdn.microsoft.com/es-es/library/windows/desktop/ms645598%28v=vs.85%29.aspx2) Registra los dispositivos obtenidos, con la función RegisterRawInputDevices:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms645600%28v=vs.85%29.aspx3) Intercepta los mensajes de la ventana (WndProc):
https://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc%28v=vs.110%29.aspx4) Espera a que se reciba el mensaje WM_INPUT (0x00FF):
https://msdn.microsoft.com/en-us/library/windows/desktop/ms645590%28v=vs.85%29.aspx5) Examina el parámetro lParam del mensaje filtrado, el cual contiene una dirección de memoria hacia una estructura RAWKEYBOARD ...debes asignar los datos del bloque de la memoria no administrada hacia una instancia de esa estructura (lo haces con la Class Marshal) para determinar de que teclado proviene la entrada (el input) además de la tecla virtual (vKey) y el tipo de mensaje (WM_KEYDOWN, WM_KEYUP, etc):
https://msdn.microsoft.com/en-us/library/windows/desktop/ms645575%28v=vs.85%29.aspx6) Evaluas si es el teclado que quieres que sea, y activas un flag booleano en cualquier parte (Dim isPrimaryKeyboard = True), o guardas los datos que quieras para hacer otro tipo de evaluaciones...
7) Cuando se dispare el evento KeyPress en tu event-handler, determinas la cancelación del evento (e.Handled) dependiendo del valor de ese flag, o de dicha evaluación.
8) Vuelta a empezar desde el punto nº4.
Aquí tienes un ejemplo (no lo he probado):
http://www.codeproject.com/Articles/17123/Using-Raw-Input-from-C-to-handle-multiple-keyboardSaludos