我需要在Windows 7中交换Alt键function。一家大公司需要那些在打字机上写字的老年人,左侧有变音符字符,但现在正在使用的Win7已经有了Alt的function。
两天的研究把我带到了一个驱动解决scheme。 我需要原始的Windows 7驱动程序的源代码(两个.sys
文件似乎是键盘驱动程序),并可能在Windows DDK中修改它们。 或者我需要做一个额外的驱动程序,可以使用默认的驱动程序。 正如我所看到的,解决scheme将在C或C ++。 但是我需要怎样去完成呢? 我应该采取什么措施?
限制是:
稍后添加:我有我需要的一切,但不是处理交换的代码。 例如,我为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); }
所以我简单地交换按下和释放两个键的扫描码。 正确的ALT正在发送两个扫描码,我不知道这是通过这个函数的两个调用,或者在InputDataStart
结构中创build两个扫描码。 我会尝试哔哔,每个Alt扫描码,但你的帮助将不胜感激。
解:
if (InputDataStart->MakeCode==0x38 || InputDataStart->MakeCode==0xb8) InputDataStart->Flags^=KEY_E0;
它交换左右Alt键功能。
现在我需要使交换可配置。 为了最好的 – 按两个阿尔特。