현실감각 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

 

 

 

 



  • 흐흑 2012.11.02 12:05

    ㅠㅠ 어디다가 복사하거나 어디서 하는건지..하는방법좀여 ㅠㅠ

    • 현실감각0% 2012.11.15 14:26 신고

      음.. 다중 키보드를 각각 사용할 수 있는 어플리케이션을 원하시는거 같은데.. 이건 그런 프로그램을 만들 수 있는 소스코드입니다. 필요로 하시는 것이 무엇인지는 모르지만 이 소스를 베이스로 만드셔야할듯..;

  • 제작자 2012.12.18 13:46

    와...정말 대박이십니다.. 전 이것을 배경으로 지금 뭔가 하고있는데 제가 고민하던것을 날려주시네요..^^

    퍼갈께요~~ ^^

  • 수련생 2012.12.19 20:36

    바쁘신건가요? 메일드렸는데 확인을 안하시길래 댓글달아용ㅜㅋ

  • 유금희 2013.07.30 17:48

    안녕하세요!
    제가 요즘 이런걸 연구하고 있었는데, 이거 c프로그램으로 짜는 거에요?
    제가 전공을 했지만, 프로그램쪽으로는 너무 오래 손을 놓은지라 잘 몰라서요.

  • 유금희 2013.07.30 18:03

    이 프로그램하고 플래시를 접목할 수 있을까요?

    • 현실감각0% 2013.07.30 18:25 신고

      안녕하세요~^^
      제가 올린 소스코드는 c# 소스코드입니다.
      그래서 플래시에 바로 적용하시기엔 무리가 있고요.
      플래시에서는 보통 자바를 많이 이용하잖아요.
      제가 플래시를 안쓴지가 거의 한 7~8년 되어서;;;
      확실하게 대답해드릴수는 없지만, 해당 c#소스를 자바소스로
      변환하신 후에 사용하시면 될것 같습니다.
      또는 구글에 검색하셔서 찾아보시는것도 좋을것같아요.
      구글에 검색해보니까 http://nanlee.wordpress.com/2013/06/12/manykeyboard-using-java-hid-api-to-handle-multiple-keyboard-input/
      여기에 나오는거같은데요. 전 영어울렁증이 있어서 자세히 읽어보진 않았습니다.ㅠㅠ 한번 참고해보세요~

  • 유금희 2014.04.21 14:45

    안녕하세요!
    올려주신 소스를 보고 제가 연구하고 있는데요
    근데 제가 같은 화면 다른 곳에 키가 입력되도록 하고 있는데,
    키보드를 인식하여 겹치지 않고 입력이 되고 있는데
    문제는 shift키를 누르면 다른 입력칸에도 shift가 눌린 상태로 입력이 된다는 겁니다.
    왜그럴까요?
    혹시 이 글을 읽으신다면 힌트를 주실 수 있을까요?

  • 정호준 2014.11.01 02:46

    if( deviceClass.ToUpper().Equals( "KEYBOARD" ))
    {

    이부분에서 항상 NullRefernceException was ungandled 라는 오류가 나옵니다.
    (개체 참조가 개체의 인스턴스로 설정되지 않았습니다락ㅎ 나옵니다.

    ㅙ결방안을 빨리 알려주셔요. 감사ㅘㅂ니다.

  • 오상훈 2015.03.20 18:21

    님 자료를 잘 사용 하고 있습니다. 몇가지 버그가 있어 수정된 부분을 알려드립니다.~!
    protected override void WndProc( ref Message message )
    {
    if( id != null )
    {
    NumberOfKeyboards = id.EnumerateDevices(); //2015.03.13 $osh
    id.ProcessMessage( message );

    }
    base.WndProc( ref message );
    }
    프로그램 실행뒤 새로운 디바이스를 연결하고 이벤트 발생시 에러및 버그가 발생하여 수정하였습니다.

  • 오상훈 2015.03.20 18:26

    windows8 이후 버젼에서는 레지스트리에 "Class" 존재 하지않아 Getvalue시에 에러발생 예외처리 추가했습니다.

    ---private string ReadReg( string item, ref bool isKeyboard )---
    string deviceDesc = "";
    string deviceClass = "";
    if (null != OurKey.GetValue("DeviceDesc"))
    {
    deviceDesc = (string)OurKey.GetValue("DeviceDesc");
    }
    if (null != OurKey.GetValue("Class"))
    {
    deviceClass = (string)OurKey.GetValue("Class");
    }

  • 오상훈 2015.03.20 18:30

    windows8에서 레지스트리 정보를 못가져오는 부분이 있어 비교를 하지못합니다.
    조건문에서 IsKeyboardDevice<---이부분을 없에버리고 (rid.dwType == RIM_TYPEKEYBOARD))으로 변경했습니다

    ---------public int EnumerateDevices()----------
    if ((!deviceList.Contains(rid.hDevice)) && (rid.dwType == RIM_TYPEKEYBOARD))
    {
    NumberOfDevices++;
    deviceList.Add(rid.hDevice, dInfo);
    }

  • 오상훈 2015.03.20 18:31

    님 자료로 인하여 수월하게 바코드스캔 관련 프로젝트를 하고 있습니다 정보 공유에 매우 감사합니다.
    ilmaredark@naver.com

    • chabert1@nate.com 2015.05.14 13:21

      아 이제서야 답글을 봤습니다-_-;;;
      제가 블로그를 방치를 넘어 거의 방생하다시피해서
      수월하게 프로젝트 수행하고 계신다니 다행이네요.
      혹시 안되는거 있으면 부담갖지마시고 제 메일로 연락주세요~

    • 삼우 2019.01.25 05:03

      덕분에 저도 잘 수정해서 쓰고있습니다 원글님과 오상훈님 두분 모두께 감사합니다.

  • 이재용 2016.09.08 21:46

    윈 10 이라 그런지 알려주신 예제로는 사용 할 수가 없네요 ㅜ
    오상훈 님께서 수정 하셨다는 부분은 이해할수가 없어서 적용 시켜 볼 엄두가 나질 않네요 ㅜㅜ

  • 초보자 2017.02.09 09:29

    너무너무 감사합니다 ㅜ 열심히 찾고 있었는데..
    혹시 윈도우7 64비트 환경에서는 컴파일은 되는데 실행시 아무 반응도 없더라고요 ㅜ 왜 그런걸까요 ㅜ

  • 지나가다 2017.03.23 06:52

    대단하시네요
    지나가다 봅니다.
    윈도10 쓰시는경우 호환성보기로 맞춰주심 됩니다

  • 뉴비프로그래머 2017.11.30 10:51

    테스트 하신건 서로 다른종류의 키보드에서 입력을 구분하시고 계신데
    혹시 위의 방법으로 같은회사 같은제품의 바코드 리더기 2개도 구분 가능한가요?

    • 현실감각0% 2017.12.15 14:21 신고

      답변이 많이 늦었네요 죄송합니다 ㅠ
      위 방법을 쓰면 같은제품의 바코드스캐너라도 구분 가능합니다.