현실감각 0% :: 현실감각 0%

컴퓨터 관련 2012. 10. 15. 17:21

[C#] 한 컴퓨터에 키보드 여러개 설치하고 각각 입력받기!!



한 컴퓨터에 키보드 여러개 설치하고 각각 입력받기!!

 

 

오늘 회사에서 약간의 말다툼이 있었는데 그 말다툼의 원인은 바로 한 컴퓨터에 여러개의 USB 키보드(혹은 KEYBOARD로 인식되는 기타 USB장치)를 연결하고 그것들을 각각 구분해서 쓸수 있냐는 의문에서 시작되었다. 난 당연히 구분해서 쓸수있다고 했고, 상대방은 안된다고 하길래 텍스트박스 3개 놓고 KEYBOARD 디바이스 3개 설치한 후, 1번 키보드는 1번 텍스트박스, 2번 키보드는 2번 텍스트박스 이런식으로 입력되는 간단한 프로그램을 2시간 안에 만든다에 양주 한병 걸고 신나게 구글링 시작..ㅋㅋ

 

 

검색한지 30분도 안되서 코드프로젝트에서 아래와 같은 글을 발견!ㅋ

 

http://www.codeproject.com/Articles/17123/Using-Raw-Input-from-C-to-handle-multiple-keyboard

 

내용인즉슨 여러대의 디바이스(키보드) 각각의 정보를 출력해주는것인데...

친절하게도 코드까지 첨부되어있다!!

키보드로 이런저런 입력하면 핸들값 뿐만 아니라 키보드의 고유이름, 디바이스 종류까지 싹 긁어올 수 있는데 핸들값은 USB를 뽑고 다시끼거나, 프로그램을 재실행하거나 컴퓨터를 끄거나 하면 변경되는 사항이고 디바이스 종류는 종류가 같으면 다 동일하게 출력되기 때문에 키보드의 고유이름을 가지고 구분하기로 하였다.

 

 

폼을 새로 만들것도 없이 코드프로젝트에서 받은 소스코드를 베이스로 조금 수정해서 완성!!

 

 

 

 

이건 키보드1번(PS/2)으로 입력받았을때의 모습.

 

 

 

 

 

이건 키보드 2번(USB)으로 입력!

 

 

 

 

 

이건 USB 바코드리더기로 바코드를 찍어 입력받았을때의 모습. 바코드리더기도 키보드로 인식된다.

 

 

 

여기서 주목해야할 것이 바로 Name 이다. 이녀석은 컴퓨터를 껏다가 다시 켜도 변경되지가 않기 때문에 충분히 이녀석 하나만으로 디바이스를 구분할 수 있었다.(단, USB를 뽑아서 다른 USB 포트에 꽂았을 경우 바뀌는지는 확인해보지 않았다.) 코드프로젝트에서 다운받은 파일을 보면 InputDevice.cs 파일이 있는데 이녀석은 까보기가 귀찮아서 나중에 시간나면 까보기로 하고 다음과 같이 간단히 디바이스 이름이 동일한지 판단하는 코드만 추가해서 1시간만에 완성!

 

if (e.Keyboard.deviceName.Replace("&", "&&") == "\\\\?\\ACPI#PNP0303#4&&31296f4f&&0#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}")
{
    textBox1.Focus();
}
else if (e.Keyboard.deviceName.Replace("&", "&&") == "\\\\?\\HID#VID_0566&&PID_3032&&MI_00#7&&cacf6ea&&0&&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}")
{
    textBox2.Focus();
}
else

{
    textBox3.Focus();

}

 

 

이런식으로 간단히 코딩해줬는데도 키보드 동시입력(예를들면 1번 키보드는 k를 계속 누르고, 그 중간중간 2번 키보드로 l을 누름)시에 텍스트가 엉키지 않고 모두 제대로 나왔다. 딱히 바로 쓸데가 있는 것은 아니지만 하나의 컴퓨터에 여러개의 바코드리더기를 설치하고 각각 다른 데이터를 입력하는 작업 등을 수행하는 시스템을 만들때 응용하는것도 나쁘지 않을듯.

 

흐흐흐흐 결국 양주는 나의것!!

 

 

 

아래는 소스! (vs2008)

 

 

RawInput.zip