2011-04-11 5 views
11

한 컴퓨터에는 일반 키보드와 키보드를 에뮬레이트하는 바코드 스캐너가 있습니다. 내 앱이 키보드 입력을 받으면 어떻게 그 입력이 바코드 스캐너 또는 실제 키보드에서 나오는지 확인할 수 있습니까?키보드 입력이 바코드 스캐너에서 오는 것인지 어떻게 알 수 있습니까?

+1

1. 메모장을 엽니 다. 2. 키보드에서 입력을 생성하는 키보드를 입력하십시오. –

+0

감사하지만 C# 코드로 확인하고 싶습니다 !! –

+0

@raha 왜 그렇게하고 싶습니까? –

답변

6

둘 다 입력을 받게됩니다. 아니 동시에, 물론. 그것은 모두 대기열에 배치되지만 Windows는 두 키보드의 키 이벤트를 처리합니다.

그러나, 도움이되지 마십시오. David Heffernan이 말했듯이 두 키보드를 컴퓨터에 연결하고 메모장을 열고 임의의 문자를 입력하여 어느 것이 입력을 생성하는지 쉽게 알 수 있습니다.

"C# 코드로 확인"하고 싶다고 대답했지만 그게 무슨 뜻인지는 알 수 없습니다. 키보드 입력을 읽고 화면에 표시하는 콘솔 앱을 만드는 방법은 어떻습니까?

using System; 

class AdvancedKeyboardTester 
{ 
    static void Main(string[] args) 
    { 
     for (; ;) 
     { 
     Console.ReadKey(); 
     } 
    } 
} 

을 눌러 Ctrl 키 + C 당신이 재미의 타이어가 프로그램을 종료 할.


편집 : 당신이 당신의 모든 키보드의 원료 인 에이블 입력하고 메시지를 전송하는 장치를 결정하기 위해 결과를 열거 할 수 있습니다 RegisterRawInputDevices function을 찾고있는 것 같습니다. Using Raw Input from C# to handle multiple keyboards


편집 : 2 :

다행히 사람이 이미이에 대한 C#을 래퍼 라이브러리를 작성했습니다처럼, 그것은 코드 프로젝트에서 다운로드 가능한 보이는는 (이 정보는 단지에서 속여 유지 보인다 의견)

바코드 스캐너를 사용하는 경우 훨씬 편리합니다. 이러한 목적으로 명시 적으로 설계 되었기 때문에 거의 모든 것이 입니다. 표준 키보드가 아닌 바코드 스캐너에서 입력이 있음을 나타내는 일부 센티널 문자를 입력에 접두사 (및/또는 접미사)로 표시 할 수 있음을 의미합니다. (자세한 정보는 바코드 스캐너의 사용자 설명서를 확인하십시오.) 그런 다음 센티널 문자의 유무에 따라 키보드 입력을 필터링하면됩니다. 또한 접두어와 접미어 사이의 문자가 얼마나 빨리 입력되었는지 확인할 수 있습니다.

+0

ok.you 진짜로 저를 도와주세요. 그러나 나는 이것을 이해할 수 없습니다. 당신이해야 할 일은 센티넬 문자의 존재 여부에 따라 키보드 입력을 필터링하는 것입니다. –

+0

@raha : 기본적으로 컴퓨터에 기본적으로 "안녕하세요, 나"라고 말하는 문자를 보내도록 스캐너를 구성 할 수 있습니다. 입력 스트림에서 해당 문자를 볼 때 사용자가 키보드에서 입력 한 내용이 아니라 바코드 스캐너에서 정보가 전달된다는 것을 알고 있습니다. 바코드 스캐너와 함께 제공된 설명서를 확인 했습니까? 이에 대한 자세한 정보가 있어야합니다. –

+0

감사합니다. 친애하는 코디 gray.i는 마침내 그것을 얻었다! 나는 그것을 점검 할 것이다. (나는 아직 그것을 가지지 않고있다!!). –

1

이것은 OS에 따라 다르지만 대부분의 최신 운영 체제에서는 두 가지 모두에서 동시에 입력 할 수 있습니다. 가장 좋은 방법은 플랫폼에서 실제로 시도하는 것입니다. 두 사람이 동시에 입력 할 필요

피)

+0

나는 windows xp를 사용한다. –

4

마이크로 소프트의 멀티 포인트 SDK를 살펴 보자

(편집 :이 답변이 더 이상 적용 이제 문제는 명확하게 된 것을 내가 해요 없습니다. 다른 사람들이 발견 할 수 있도록 여기에 남겨 둡니다.)

+0

ok.thanks.but Microsoft의 MultiPoint SDK에 대해 조금 설명해 주시겠습니까? –

+0

** 키보드 **는 어떻게 작동합니까? –

+0

http://en.wikipedia.org/wiki/Windows_MultiPoint_Mouse_SDK 참조 : "각 스테이션에 단일 모니터, USB 2.0 허브, 키보드 및 마우스를 연결하여 여러 스테이션을 WMS 2010 호스트 컴퓨터에 추가 할 수 있습니다." –

1

키 입력 사이의 시간 지연을 이벤트 수신기에서 확인하십시오. 키보드를 사용하는 사람의 입력은 비교적 느린 반면, 바코드 스캐너는 키 스트로크를 매우 빠르게 전송합니다. 웹 응용 프로그램에서 Javascript를 사용하여 이러한 작업을 수행했기 때문에 이것이 효과가 있다는 것을 알고 있습니다.

C# 프로그래밍에 대해 잘 모르겠습니다. 행복한 날!

0

시도 :

Dim PreviousKeyPressTime As DateTime = Nothing 

Private Sub TextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown 

    If e.KeyCode = Keys.Enter Then 
     PreviousKeyPressTime = Nothing 
     TextBox1.Text = String.Empty 
    Else 
     If PreviousKeyPressTime = Nothing Then 
      PreviousKeyPressTime = DateTime.Now 
     End If 
     Dim startTime As DateTime = Now 
     Dim runLength As Global.System.TimeSpan = startTime.Subtract(CType(Me.PreviousKeyPressTime, DateTime)) 
     Dim millisecs As Integer = runLength.Milliseconds 
     Dim secs As Integer = runLength.Seconds 
     Dim TotalMiliSecs As Integer = ((secs * 1000) + millisecs) 

     lblDiff.Text = TotalMiliSecs 

     If TotalMiliSecs <= 50 Then 
      lblMsg.Text = String.Empty 
     Else 
      lblMsg.Text = "keyboard Input not Allow" 
     End If 
     PreviousKeyPressTime = DateTime.Now 
    End If 
End Sub 

출처 :

+1

게시 한 코드를 설명하는 것이 더 낫습니다.또한 블로그 링크는 글을 쓰는 시점에서 죽었습니다. –

+0

이 코드는 얼마나 빨리 키가 들어 왔는지를 나타내고 너무 느리면 사람이 입력하는 것으로 결정합니다. 실제로 작동하는지는 알 수 없지만 이것이 코드의 의도입니다. – Hucker

0

거의 모든 바코드 리더는 그것을 읽고 어떤 접두사와 접미사로 구성 할 수 있습니다 http://itlearnerinsect.blogspot.com/. 예를 들어 접두사 "*"와 접미사를 사용하여 구성한 다음 C# 코드에서 입력 스트림에서 *를 가져오고이 텍스트 상자의 lostfocus 이벤트가 발생할 때마다 보이지 않는 텍스트 상자에 포커스를 강제로 적용하십시오 모든 코드를 입력하여 처리하십시오. 접두사로 선택한 문자는 키보드에 입력되지 않습니다. 또한 화면을 탐색 할 때 사용자가 객체에 도달하지 못하도록 텍스트 상자의 tabstop 속성을 false로 설정하십시오. 행운을 빕니다 !

1

다음은 @ asif의 대답으로 모델링 한 것입니다. 그것은 WPF 애플 리케이션에서 사용하기위한 C#이며 테스트를 거쳤습니다. 스톱워치는 datetime보다 정확하기 때문에 System.Diagnostics 네임 스페이스에서 찾을 수 있습니다.

특정 텍스트 상자가 아닌 앱에 포커스가있을 때 텍스트를 캡처하고 싶었 기 때문에 약간 다릅니다. 제대로 처리하기 위해서는 실제 문자가 삽입되는 것을 알지 못하기 때문에 Key 열거 형만 나타납니다. 1부터 10까지의 숫자를 주로 염두에두고 그 열거 형은 D1, D2 등 이었기 때문에 필요할 때 D 부분을 제거합니다.

Stopwatch _inputStopwatch = new Stopwatch(); 
string _input = ""; 

private void Window_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Enter) 
    { 
     _inputStopwatch.Reset(); 
     HandleBarcode(_input); 
     _input = ""; 
    } 
    else 
    { 
     if (!_inputStopwatch.IsRunning) 
      _inputStopwatch.Start(); 
     else if (_inputStopwatch.ElapsedMilliseconds > 50) 
     { 
      _inputStopwatch.Restart(); 
      _input = ""; 
     } 

     Console.WriteLine("DEBUG: " + e.Key + " - " + _inputStopwatch.ElapsedMilliseconds + "ms"); 

     var keyString = e.Key.ToString(); 
     if (keyString.Length == 2 && keyString.StartsWith("D")) 
      keyString = keyString[1].ToString(); 

     //if (_inputStopwatch.ElapsedMilliseconds < 50) 
      _input += keyString; 
     //else 
     // _input = ""; 

     _inputStopwatch.Restart(); 
    } 
} 

private void HandleBarcode(string barcodeInput) 
{ 
    //do stuff with the barcode input 
} 
관련 문제