Меняем функциональность клавиш Alt
Мне нужно поменять местами функциональность клавиш Alt в Windows 7. Большой компании это нужно для пожилых людей, которые пишут на пишущих машинках, на левой стороне которых была клавиша с диакритическими знаками, но в Win7, над которой они работают, теперь есть право Alt для этой цели.
Два дня исследований привели меня к решению проблемы с драйверами. Мне нужен исходный код для оригинальных драйверов Windows 7 (два .sys
файлы, как представляется, драйверы клавиатуры), и, возможно, изменить их в Windows DDK. Или мне нужно сделать дополнительный драйвер, который бы работал со стандартными. Как я вижу, решение будет на C или C++. Но каким путем я должен идти, чтобы достигнуть этого? Какие шаги я должен предпринять?
Ограничения:
- Один перезапуск системы только для установки драйвера.
- Простой способ поменять клавиши Alt при работе в Win7 (поменять местами клавиши Alt, нажав их обе).
- Нет переназначения клавиатуры 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.