Хорошо, вот действительно хитрый метод, который будет работать только с очень ограниченным подмножеством вариантов использования:
- Лента, склейка или короткое замыкание набора клавиш-модификаторов (например, правый Ctrl) на одной из клавиатур.
- При каждом нажатии клавиши посмотрите на модификаторы. Если модификаторы установлены так, как если бы они были на приклеенной клавиатуре, предположим, что клавиатура является источником. Если нет, предположим, что это другая клавиатура.
Ограничения:
- Вы не можете использовать приклеенную клавиатуру вне вашего приложения, поскольку только она знает, что игнорирует клавиши-модификаторы.
- Вы не можете использовать эти клавиши-модификаторы в своем собственном приложении как часть сочетаний клавиш.
- Другая клавиатура может выдать себя за вашу (случайно или нет), если пользователь нажмет правильные кнопки.
- Вам нужно будет отключить StickyKeys.
- Использование Alt или Ctrl имеет обратную сторону: если вы нажмете другой , Windows может использовать эту комбинацию, которую ваше приложение не поймает.
Неизвестно # 1 : заполняется ли ModifierKeys только с клавиатуры, которая была источником нажатия клавиши, или из суммы всех модификаторов на всех подключенных клавиатурах. Я подозреваю, каждая клавиатура внутренне отправляет модификаторы, прикрепленные к нажатию клавиши, и что Windows не объединяет их.
Неизвестно # 2 : независимо от того, предоставляет ли System.Windows.Forms.Control.ModifierKeys только биты Ctrl / Shift / Alt или предоставляет достаточно деталей, чтобы, скажем, различать Правая клавиша Ctrl слева. Вот ключи, которые вы могли бы теоретически проверить, я не знаю, сколько из них предоставляется с помощью ModifierKeys:
http://msdn.microsoft.com/en-us/library/system.windows.forms.keys.aspx