I'm on your side, when times get rough.

2023-08-31

[C#] QR Scanner (Zebra DS9038)

Filed under: Programming — Peter_KIM @ 08:52

KIOSK / POS 응용 프로그램에서 USB 연결을 이용하는 장치는 해당 드라이버를 설치하고 사용하는 것이 일반적입니다. 간혹, 이런 일반적인 사항을 무시하고, 운영체제에서 기본으로 제공하는 기능을 이용하는 것은 바람직하지 못합니다.

예를 들어, USB 연결을 지원하는 여러 종류의 바코드 스캐너를 Windows 운영 체제의 컴퓨터에 연결하면 기본적으로 사용 가능상태로 변화하고, QR 또는 바코드를 가까이 대면, 현재 활성화된 프로그램에 해당 정보를 전달할 것입니다. 그러나, 특수 목적의 프로그램에서 이런 정보를 이용하려 한다면, 좀 더 연결과 데이터처리에 대한 관점에서 어떤 연결이 좋을지 살펴보는 것이 좋습니다.

최근 Zebra DS9038 바코드 스캐너를 이용한 연결을 작업했는데, 예전의 코드를 보면서 많은 생각을 했습니다. 왜 이런 방식을 이용할 수밖에 없었는지 안타까울 뿐이었습니다.
요즘은 하나의 언어로 솔루션을 개발하는 일이 거의 없습니다. 상황에 맞추어 여러가지 언어를 엮어서 사용하기도 합니다.

바코드 스캐너는 대부분 HID(human interface device) 키보드 에뮬레이션 모드와 OPOS(OLE for Retail POS) 모드를 지원합니다. 가능하다면, OPOS 모드를 추천합니다.

HID KBD 모드에서 바코드를 읽으면 해당 정보는 대부분 현재 윈도우의 가장 위에 활성화한 응용 프로그램으로 전달할 것이지만, OPOS 모드에서는 지정한 특정 프로그램으로만 전달됩니다.

C++ 프로그램으로 구현이 어렵다면, 좀 더 편한 C# 언어로 만들고, QR(바코드) 정보가 필요한 응용 프로그램으로 전달하는 것도 괜찮을 것입니다.

Windows 응용 프로그램 사이에서 정보를 전달하는 가장 손쉬운 방법은 SendMessage 함수와 WM_COPYDATA 메시지를 이용하는 것입니다.

public const Int32 WM_COPYDATA = 0x004A;
public struct COPYDATASTRUCT
{
    public IntPtr dwData;
    public int cbData;
    [MarshalAs(UnmanagedType.LPStr)]
    public string lpData;
}
 
[DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)]
public static extern IntPtr SendCopyData(IntPtr hWnduint Msguint wParamref COPYDATASTRUCT lParam);
private void SendBarcodeToTarget(string sProcessNamestring sBarcode)
{
    Process[] arrProcess = Process.GetProcessesByName(sProcessName);
    if (arrProcess.Length == 0)
        return;
 
    COPYDATASTRUCT cds = new COPYDATASTRUCT
    {
        dwData = IntPtr.Zero,
        cbData = Encoding.Default.GetBytes(sBarcode).Length + 1,
        lpData = sBarcode
    };
    SendCopyData(arrProcess[0].MainWindowHandle, WM_COPYDATA, 0ref cds);
}

위와 같이 하면, 구태여, HID KBD 방식으로 연결하여 복잡하게 응용 프로그램에서 처리할 필요가 없습니다. 프로그램의 화면은 아래와 같습니다. 

전체 프로그램의 코드는 아래의 주소에서 내려받을 수 있습니다.
https://1drv.ms/u/s!An5hHO7t37wbh3s56tUeV921eRh_?e=0baeKD

Leave a Comment »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment

Blog at WordPress.com.