MSura, спасибо большое! Вы мне очень помогли!
Кстати, я послал вопрос на несколько форумов, и только здесь мне ответили по существу

Вот кусок кода, который получает один char, может кому пригодится:
USHORT ProcessInput() {
UNICODE_STRING KeyboardName = RTL_CONSTANT_STRING(L"\\Device\\KeyboardClass0");
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status;
USHORT Res;
InitializeObjectAttributes(&ObjectAttributes, &KeyboardName, OBJ_CASE_INSENSITIVE, NULL, NULL);
Status = NtCreateFile(&StdInput, GENERIC_READ | SYNCHRONIZE | FILE_READ_ATTRIBUTES,
&ObjectAttributes, &IoStatusBlock, 0, FILE_ATTRIBUTE_NORMAL, 0,
FILE_OPEN, FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, 0, 0);
{
KEYBOARD_INPUT_DATA InputData;
Status = NtReadFile(StdInput, NULL, NULL, NULL, &IoStatusBlock, &InputData, sizeof(KEYBOARD_INPUT_DATA), NULL, 0);
Res = InputData.MakeCode;
}
NtClose(StdInput);
return Res;
}
K>Кстати, я послал вопрос на несколько форумов, и только здесь мне ответили по существу
K>Вот кусок кода, который получает один char, может кому пригодится:
K>USHORT ProcessInput() {
K> UNICODE_STRING KeyboardName = RTL_CONSTANT_STRING(L"\\Device\\KeyboardClass0");
...
Я не зря говорил про 100 клавиатур.
В NT варианте autochk действительно использовалась только клавиатура 0, но начиная с Win2K autochk стала открывать 100 клавиатур.
Я за свою практику встречал один случай, когда клавиатура 0 не работала, а работала номер 2. Как такое получилось и как это воспроизвести я не знаю, но это именно этот случай заставил меня сканировать 100 клавиатур. Но сканирование я делал только до первого символа, далее работал только с определенной клавиатурой. Я думаю маловероятно, что будут подключены сразу две клавиатуры и ввод будет с обоих.