2012-09-27 4 views
3

Windows 7에서 Alt 키 기능을 교환해야합니다. 커다란 회사는 왼쪽에 분음 부호 문자가있는 타자기를 쓰고있는 노인들에게 필요합니다. 그러나 그들이 작업하고있는 Win7 지금이 목적을 위해 Alt이 있습니다.대체 키 기능 교환

연구 2 일 동안 나를 드라이버 솔루션으로 데려왔다. 원본 Windows 7 드라이버 (두 개의 .sys 파일이 키보드 드라이버 인 것 같음) 소스 코드가 필요하며 Windows DDK에서 수정할 수 있습니다. 또는 기본 드라이버로 작동하는 추가 드라이버를 만들어야합니다. 볼 수 있듯이 솔루션은 C 또는 C++입니다. 그러나 이것을 달성하기 위해 내가 어떻게해야합니까? 어떤 단계를 밟아야합니까?

한계는 다음과 같습니다

  1. 하나의 시스템은 드라이버 설치 만 다시 시작합니다.
  2. Win7에서 작업 할 때 Alt 키를 교환하는 간단한 방법 (두 키를 모두 눌러 Alt 키 교환).
  3. 다시 시작해야하는 Win7 키보드 다시 매핑이 없습니다.

나중에 추가 : 필요한 모든 것이 있지만 스왑을 처리 할 코드는 없습니다. 예를 들어, 스위치를 올바르게 만들었습니다. Shift을 입력하십시오. 전송 된 스캔 코드가 하나뿐이기 때문입니다.

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 키를 전송 Alt 키를 떠났다. 오른쪽 Alt은 두 개의 scancode를 보내고 있으며이 함수를 두 번 호출하여 해당 작업을 수행하는지 확인하거나 InputDataStart 구조의 두 scancodes를 작성하는지 확실하지 않습니다. 나는 매번 Alt scancode의 경고음을 울리려고 노력 하겠지만 도움을 주시면 감사하겠습니다.

+0

기존 드라이버를 수정하지 않고 클래스 필터 드라이버 (하위 수준 장치 드라이버와 kbdclass 사이에 있음)를 작성하려고합니다. DDK에는 예제 키보드 필터 드라이버와 kbdclass에 대한 소스 코드가 들어있어 참조 용으로 유용 할 수 있습니다. –

+0

나는 그것을 시도하고 피드백을 줄 것이다. – pbies

+0

.sys에 kbfilter (샘플 키보드 필터 드라이버)를 빌드하고 지시 사항에 따라 장치 관리자에 설치하고 Windows를 다시 시작했습니다. 키보드가 작동을 멈추었지만 키 누르기에 응답하지 않았습니다. 키보드를 화면 키보드로 다시 작동 시키려면이 드라이버를 제거해야했습니다. DDK (정확히 WDK 7.1.0)의 원래 kbfilter가 변경없이 정상적으로 작동한다고 주장하는 것처럼 작동하지 않습니다. 나는 kbfiltr.htm 파일에서와 같이 전체 과정을 만들었습니다. Visual Studio 또는 build.exe 옆에있는 다른 파일과 드라이버를 설치하는 데 필요한 파일을 사용하지 않았습니다. 어떤 도움이 필요합니까? – pbies

답변

0

솔루션 : 오른쪽 왼쪽 Alt 키의 기능을 교환합니다

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

.

이제 스와핑을 구성 할 수 있도록 설정해야합니다. 가장 좋은 방법은 Alts를 누르는 것입니다.

+0

위의 해결 방법은 Alt 키를 누르거나 (make) 누르고 해제하는 것입니다. Windows 7 x64에서 정상적으로 작동하는 동안 Print Screen 키가 Alts를 바꾼 필터 드라이버를 이미 만들었습니다. Alts를 한번에 두 번 눌러서 교체하는 것이 가능하다고 생각합니다. 그것은 단지 조금 더 코드입니다. 지금 그럴 필요가 없습니다. – pbies