2012-09-27 104 views
3

我需要交換Alt Windows 7中的按鍵功能。一家大公司需要那些在打字機上寫字的老人,左側有變音符字符鍵,但他們正在工作的Win7現在有Alt爲此目的。交換Alt鍵功能

兩天的研究使我得到了驅動程序解決方案。我需要原始Windows 7驅動程序的源代碼(兩個.sys文件似乎是鍵盤驅動程序),並可能在Windows DDK中修改它們。或者我需要製作一個可以與默認驅動程序配合使用的驅動程序。正如我所看到的,解決方案將使用C或C++。但是我必須通過什麼方式來完成這個任務?我應該採取什麼措施?

的限制是:

  1. 一個系統只重新啓動安裝驅動程序。
  2. 一個簡單的方法來交換替代密鑰,而在Win7中工作(交換替代鍵按下他們兩個)。
  3. 沒有Win7鍵盤重新映射,需要重新啓動。

以後補充:我有我需要的一切,但沒有處理交換的代碼。例如,我爲Shift輸入了,因爲只發送了一個掃描碼。但左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 scancode,但您的幫助將不勝感激。

+0

您可能想要編寫一個類過濾器驅動程序(位於低級設備驅動程序和kbdclass之間),而不是嘗試修改現有的驅動程序。 DDK包含一個示例鍵盤過濾器驅動程序,也是kbdclass的源代碼,可能作爲參考很有用。 –

+0

我會嘗試並提供反饋。 – pbies

+0

我已經爲.sys構建了kbfilter(示例鍵盤過濾器驅動程序),並按照說明安裝了它(在設備管理器中進行了說明)並重新啓動了Windows - 鍵盤停止工作,但它沒有響應按鍵。我需要卸載此驅動程序以使鍵盤再次工作(通過屏幕上的鍵盤)。似乎,DDK中的原始kbfilter(完全是WDK 7.1.0)聲稱無需更改就能正常工作 - 不起作用。我已經在kbfiltr.htm文件中完成了整個過程。我沒有使用Visual Studio或build.exe以及安裝驅動程序所需的一個文件。任何幫助? – pbies

回答

0

解決方案:

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

其交換左右alt鍵的功能。

現在我需要使交換可配置。最好的 - 通過按兩個阿爾特。

+0

上述解決方案是用於按下(製作)和釋放(中斷)的Alt鍵。我已經制作了過濾器驅動程序,其中Print Screen鍵在Windows 7 x64中正常工作的同時交換了Alts。我認爲這可以通過一次按下它們來交換阿爾特。這只是更多一點的代碼。現在不需要這樣做。 – pbies