Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Eclipse 如何捕获从HID条形码扫描仪发送到文本字段的*所有*字符?_Eclipse_Swt_Barcode_Hid - Fatal编程技术网

Eclipse 如何捕获从HID条形码扫描仪发送到文本字段的*所有*字符?

Eclipse 如何捕获从HID条形码扫描仪发送到文本字段的*所有*字符?,eclipse,swt,barcode,hid,Eclipse,Swt,Barcode,Hid,我需要从条形码扫描仪捕获输入。到目前为止,输入只是简单的alphanum文本,我在一个文本字段中捕获了它。我在文本字段中添加了一个ModifyListener,可以看到输入到达。这很有效 我现在需要处理一个更复杂的矩阵代码,它包含多个字段的值。这些值由不可打印的字符分隔,例如RS、GS和EOT(0x1E、0x1D、0x04)。完整的数据流有一个定义良好的标题和结尾的EOT,因此我希望能够检测条形码输入,而不是手动输入 当检测到条形码时,我可以使用记录分隔符RS分割消息并将值插入相关文本字段 但是

我需要从条形码扫描仪捕获输入。到目前为止,输入只是简单的alphanum文本,我在一个文本字段中捕获了它。我在文本字段中添加了一个
ModifyListener
,可以看到输入到达。这很有效

我现在需要处理一个更复杂的矩阵代码,它包含多个字段的值。这些值由不可打印的字符分隔,例如
RS
GS
EOT
(0x1E、0x1D、0x04)。完整的数据流有一个定义良好的标题和结尾的
EOT
,因此我希望能够检测条形码输入,而不是手动输入

当检测到条形码时,我可以使用记录分隔符
RS
分割消息并将值插入相关文本字段

但是,文本控件上的标准键处理程序会忽略这些不可打印的字符,并且它们不会出现在控件文本中。这使得不可能按计划进行


如何修改这些文本字段以接受和存储所有字符?或者我可以使用其他方法吗?

这是我用来处理条形码流的代码

public class Main
{
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args)
    {
        Display d = new Display();
        Shell shell = new Shell(d);

        shell.setLayout(new FillLayout());

        Text text = new Text(shell, 0);

        text.addListener(SWT.KeyDown, new Listener()
        {
            @Override
            public void handleEvent(Event e)
            {
                // only accept real characters
                if (e.character != 0 && e.keyCode < 0x1000000)
                {
                    sb.append(e.character);

                    String s = sb.toString();
                    // have start and end idents in buffer?
                    int i = s.indexOf("[)>");
                    if (i > -1)
                    {
                        int eot = s.indexOf("\u0004", i);
                        if (eot > -1)
                        {
                            String message = s.substring(i, eot + 1);
                            handleMessageHere(message);

                            // get ready for next message
                            sb = new StringBuilder();
                        }
                    }
                }
            }
        });

        shell.open();
        while (!shell.isDisposed())
        {
            if (!d.readAndDispatch())
                d.sleep();
        }
    }
公共类主
{
静态StringBuilder sb=新StringBuilder();
公共静态void main(字符串[]args)
{
显示d=新显示();
外壳=新外壳(d);
setLayout(新的FillLayout());
文本文本=新文本(shell,0);
text.addListener(SWT.KeyDown,newlistener())
{
@凌驾
公共无效handleEvent(事件e)
{
//只接受真实字符
if(e.character!=0&&e.keyCode<0x1000000)
{
某人附加(如字符);
字符串s=sb.toString();
//缓冲区中是否有开始和结束标识?
int i=s.indexOf(“[)>”);
如果(i>-1)
{
int-eot=s.indexOf(“\u0004”,i);
如果(eot>-1)
{
字符串消息=s.子字符串(i,eot+1);
handleMessageHere(消息);
//为下一条消息做好准备
sb=新的StringBuilder();
}
}
}
}
});
shell.open();
而(!shell.isDisposed())
{
如果(!d.readAndDispatch())
d、 睡眠();
}
}

我在
Text
类中没有看到任何过滤掉字符的内容,因此这可能是在SWT用于文本的本机控件中完成的。使用文本控件似乎不太可能实现这一点。