Меняем функциональность клавиш Alt

Мне нужно поменять местами функциональность клавиш Alt в Windows 7. Большой компании это нужно для пожилых людей, которые пишут на пишущих машинках, на левой стороне которых была клавиша с диакритическими знаками, но в Win7, над которой они работают, теперь есть право Alt для этой цели.

Два дня исследований привели меня к решению проблемы с драйверами. Мне нужен исходный код для оригинальных драйверов Windows 7 (два .sys файлы, как представляется, драйверы клавиатуры), и, возможно, изменить их в Windows DDK. Или мне нужно сделать дополнительный драйвер, который бы работал со стандартными. Как я вижу, решение будет на C или C++. Но каким путем я должен идти, чтобы достигнуть этого? Какие шаги я должен предпринять?

Ограничения:

  1. Один перезапуск системы только для установки драйвера.
  2. Простой способ поменять клавиши Alt при работе в Win7 (поменять местами клавиши Alt, нажав их обе).
  3. Нет переназначения клавиатуры Win7, которое требует перезагрузки.

Добавлено позже: у меня есть все, что мне нужно, но нет кода, который будет обрабатывать обмен. Например, я сделал переключение для правого Shift и Enter, потому что отправляется только один скан-код. Но левый Alt отправляет один, а правый Alt отправляет два сканкода:

VOID
KbFilter_ServiceCallback(
IN PDEVICE_OBJECT  DeviceObject,
IN PKEYBOARD_INPUT_DATA InputDataStart,
IN PKEYBOARD_INPUT_DATA InputDataEnd,
IN OUT PULONG InputDataConsumed
)
/*++

Routine Description:

Called when there are keyboard packets to report to the Win32 subsystem.
You can do anything you like to the packets.  For instance:

o Drop a packet altogether
o Mutate the contents of a packet
o Insert packets into the stream

Arguments:

DeviceObject - Context passed during the connect IOCTL

InputDataStart - First packet to be reported

InputDataEnd - One past the last packet to be reported.  Total number of
               packets is equal to InputDataEnd - InputDataStart

InputDataConsumed - Set to the total number of packets consumed by the RIT
                    (via the function pointer we replaced in the connect
                    IOCTL)

Return Value:

Status is returned.

--*/
{
PDEVICE_EXTENSION   devExt;
WDFDEVICE   hDevice;

hDevice = WdfWdmDeviceGetWdfDeviceHandle(DeviceObject);

devExt = FilterGetData(hDevice);

if (InputDataStart->MakeCode==0x1c)
    InputDataStart->MakeCode=0x36;
else if (InputDataStart->MakeCode==0x36)
    InputDataStart->MakeCode=0x1c;
else if (InputDataStart->MakeCode==0x9c)
    InputDataStart->MakeCode=0xb6;
else if (InputDataStart->MakeCode==0xb6)
    InputDataStart->MakeCode=0x9c;

(*(PSERVICE_CALLBACK_ROUTINE)(ULONG_PTR) devExt->UpperConnectData.ClassService)(
    devExt->UpperConnectData.ClassDeviceObject,
    InputDataStart,
    InputDataEnd,
    InputDataConsumed);
}

Поэтому я просто поменяю местами скан-коды нажатия и отпускания обеих клавиш по отдельности. Right Alt отправляет два скан-кода, и я не уверен, делает ли это это двумя вызовами этой функции или делает два скан-кода в InputDataStart состав. Я постараюсь подать звуковой сигнал на каждый Alt- скан-код, но ваша помощь будет принята с благодарностью.

1 ответ

Решение

Решение:

if (InputDataStart->MakeCode==0x38 || InputDataStart->MakeCode==0xb8)
    InputDataStart->Flags^=KEY_E0;

который меняет функциональность клавиш Alt на правую и левую

Теперь мне нужно сделать перестановку настраиваемой. Для лучшего - нажатием обеих Alts.

Другие вопросы по тегам