在vc中是如何响应条码机的,怎样把条码机读取的内容显示在List Control中。还请大虾指教。谢了

解决方案 »

  1.   

    条码机只是相当于一个键盘,所以你应该在界面上放一个edit框,条码机读出条码后还会在字符串后面加一个回车(这个一般是可设置的,可加可不加),如果条码机自动加回车,则你重写OnOK函数,将edit框的内容取出放入list即可。当然也可不放edit框,而直接接收键盘字符(比如重写OnChar函数等,方法很多),但要考虑到这种情况:条码读不出来的情况,此时应该用手动输入条码,所以还是放一个edit框为好。
      

  2.   

    条码扫描仪主要有三种接口: 1.RS232 2.共用接盘接口 3.USB外设.  对于RS232,需要编程来监视和读取条码, 对于共用接盘接口,条码信息被转换成相应的键盘消息,具有输入焦点的应用程序会收到键盘输入消息,我们以前的做法是做一个全局keyboard Hook或应用程序级别上 keyboard hook, 监视键盘消息,当有连续的键盘消息(在很短的时间内),并且这些键盘字符能构成完成的条码信息,就产生一条自定义消息,通知窗口(向监视程序注册的窗口)条码信息到达.
      

  3.   

    大家帮忙看看,我用如下函数却只能得到条码的第一个数,而且怎么改才能判断是键盘输入还是条码机输入呢?请高手帮忙改改
    BOOL CTestView::PreTranslateMessage(MSG* pMsg) 
    {
        if(pMsg->message==WM_CHAR) 
    {
       CString s;
    s=pMsg->wParam;
    m_ListCtrl.SetItemText(m2,1,s);
    m2++;
    }
    return CFormView::PreTranslateMessage(pMsg);
    }
      

  4.   

    我提取了以前一段代码作了一个测试(EAN13码的) ,你可以先测试测试(我这边没有环境),怎么给你呢?
      

  5.   

    我把代码贴在这里,你自己加进去试试:(条码扫描仪有可能需要进行设置,好像是有关回车键的设置,忘了):BarcodeScan.h#pragma once
    #include <afxtempl.h>class CBarcodeScan 
    {
    private:
    void InstallKeyboardHook();
    void UninstallKeyBoardHook();
    static LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam);
    BOOL   KeyDown(WPARAM wParam,LPARAM lParam);
    BOOL   KeyUp(WPARAM wParam,LPARAM lParam);
    CList<CWnd*,CWnd*> m_wndList;
    BOOL IsExist(CWnd* pWnd);
    public:
    CBarcodeScan();
    virtual ~CBarcodeScan();
    public:
    void Register(CWnd* pWnd);
    void NotifyWindow();
    CString GetBarCode() {return m_strBarcode;} void Reset(); CString m_strBarcode; HHOOK   m_hookID;
    DWORD   m_dwStartTime;
    BOOL    m_bStartMonitorShift;
    BOOL    m_bPressStartKey;
    int m_iLoop; BOOL    m_bScaning;
    };
      

  6.   

    BarcodeScan.cpp#define SCAN_TIME_LIMIT 100#define WM_BARCODE_NOTIFY (WM_USER+0x1000)
    CBarcodeScan* lpBarcodeScan;CBarcodeScan::CBarcodeScan()
    {
    m_dwStartTime=0;
    m_bStartMonitorShift=FALSE;
    m_bScaning=FALSE;
    m_bPressStartKey=FALSE;
    m_iLoop=0; m_strBarcode=_T("");
    m_hookID=NULL;
    InstallKeyboardHook();
    lpBarcodeScan=this;
    }CBarcodeScan::~CBarcodeScan()
    {
    m_wndList.RemoveAll();
    UninstallKeyBoardHook();
    }
    void CBarcodeScan::InstallKeyboardHook()
    {
    if(m_hookID==NULL){
    m_hookID=SetWindowsHookEx(WH_KEYBOARD, KeyboardProc,NULL,GetCurrentThreadId());
    }
    }
    void CBarcodeScan::UninstallKeyBoardHook()
    {
    if(m_hookID!=NULL){
    UnhookWindowsHookEx(m_hookID);
    }
    }
    BOOL CBarcodeScan::IsExist(CWnd* pWnd)
    {
    POSITION pos=m_wndList.GetHeadPosition();
    while(pos){
    CWnd* p=m_wndList.GetNext(pos);
    if(p==pWnd){
    return TRUE;
    }
    }
    return FALSE;
    }
    void CBarcodeScan::Register(CWnd* pWnd)
    {
    if(pWnd!=NULL && ::IsWindow(pWnd->m_hWnd) && !IsExist(pWnd)){
    m_wndList.AddTail(pWnd);
    }
    }
    void CBarcodeScan::NotifyWindow()
    {
    POSITION pos=m_wndList.GetHeadPosition();
    while(pos){
    CWnd* pWnd=m_wndList.GetNext(pos);
    if(pWnd!=NULL && ::IsWindow(pWnd->m_hWnd)){
    pWnd->SendMessage(WM_BARCODE_NOTIFY);
    }
    }
    }
    void CBarcodeScan::Reset()
    {
    m_dwStartTime=0;
    m_bStartMonitorShift=FALSE;
    m_bScaning=FALSE;
    m_bPressStartKey=FALSE;
    m_iLoop=0;
    m_strBarcode=_T("");}
    BOOL   CBarcodeScan::KeyDown(WPARAM wParam,LPARAM lParam)
    {
    DWORD dwTime=GetTickCount();
    switch(wParam){
    case VK_SHIFT:
    lpBarcodeScan->m_bStartMonitorShift=TRUE;
    TRACE("==========Shift Down !============\n");
    if(lpBarcodeScan->m_bScaning){
    lpBarcodeScan->m_iLoop=0;
    return FALSE;
    }else{
    lpBarcodeScan->m_iLoop=0;
    lpBarcodeScan->m_dwStartTime=GetTickCount();
    return FALSE;
    }
    break;
    case '8':
    if((lpBarcodeScan->m_bStartMonitorShift && (dwTime-lpBarcodeScan->m_dwStartTime)<SCAN_TIME_LIMIT ) || lpBarcodeScan->m_bScaning){
    return FALSE;
    }
    break;
    case '3':
    if((lpBarcodeScan->m_bStartMonitorShift && lpBarcodeScan->m_bPressStartKey) || lpBarcodeScan->m_bScaning){
    return FALSE;
    }
    break;
    case '0':
    case '1':
    case '2':
    case '4':
    case '5':
    case '6':
    case '7':
    case '9':
    if(lpBarcodeScan->m_bScaning){
    return FALSE;
    }
    break;
    default:
    break;
    }
    return TRUE;
    }
    BOOL   CBarcodeScan::KeyUp(WPARAM wParam,LPARAM lParam)
    {
    TCHAR szValue;
    DWORD dwTime=GetTickCount();
    switch(wParam){
    case VK_SHIFT:
    lpBarcodeScan->m_bStartMonitorShift=FALSE;
    TRACE("==========Shift Up !============\n");
    if(lpBarcodeScan->m_bScaning){
    if(lpBarcodeScan->m_iLoop==3){
    lpBarcodeScan->m_bScaning=FALSE;
    lpBarcodeScan->NotifyWindow();
    lpBarcodeScan->Reset();
    return FALSE;
    }
    }else{ 
    if(lpBarcodeScan->m_iLoop==3){
    lpBarcodeScan->m_bPressStartKey=TRUE;
    lpBarcodeScan->m_bScaning=TRUE;
    lpBarcodeScan->m_strBarcode="";
    lpBarcodeScan->m_iLoop=0;
    return FALSE;
    }else{
    lpBarcodeScan->Reset();
    }
    }
    break;
    case '8':
    if(lpBarcodeScan->m_bStartMonitorShift && (dwTime-lpBarcodeScan->m_dwStartTime)< SCAN_TIME_LIMIT ){
    lpBarcodeScan->m_iLoop++;
    TRACE("========== * Up [%d]============\n",lpBarcodeScan->m_iLoop);
    return FALSE;
    }else{
    if(lpBarcodeScan->m_bScaning){
    szValue=wParam;
    lpBarcodeScan->m_strBarcode+=szValue;
    return FALSE;
    }
    }
    break;
    case '3':
    if(lpBarcodeScan->m_bStartMonitorShift && m_bPressStartKey){
    lpBarcodeScan->m_iLoop++;
    TRACE("========== # Up [%d]============\n",lpBarcodeScan->m_iLoop);
    return FALSE;
    }else{
    if(lpBarcodeScan->m_bScaning){
    szValue=wParam;
    lpBarcodeScan->m_strBarcode+=szValue;
    return FALSE;
    }
    }
    break;
    case '0':
    case '1':
    case '2':
    case '4':
    case '5':
    case '6':
    case '7':
    case '9':
    if(lpBarcodeScan->m_bScaning){
    szValue=wParam;
    lpBarcodeScan->m_strBarcode+=szValue;
    return FALSE;
    }
    break;
    default:
    lpBarcodeScan->Reset();
    break;
    }
    return TRUE;
    }LRESULT CALLBACK CBarcodeScan::KeyboardProc(int code,WPARAM wParam,LPARAM lParam)
    {
    if(code<0){
    return CallNextHookEx(lpBarcodeScan->m_hookID,code,wParam,lParam);
    }else{
    if(code==HC_ACTION){
    BOOL bUp=lParam & 0x40000000;
    BOOL bCallNextHook=TRUE;
    TRACE("Key Code [%d]\n",wParam);
    if(bUp){
    bCallNextHook=lpBarcodeScan->KeyUp(wParam,lParam);
    }else{
    bCallNextHook=lpBarcodeScan->KeyDown(wParam,lParam);
    }
    TRACE("CallNextHook [%s]\n",bCallNextHook?"YES":"NO");
    if(bCallNextHook)
    return CallNextHookEx(lpBarcodeScan->m_hookID,code,wParam,lParam);
    else
    return 1;
    }
    return CallNextHookEx(lpBarcodeScan->m_hookID,code,wParam,lParam);
    }
    }
      

  7.   

    使用这个类:在你的 FormView 类使用这个类,class CMonitorBarcodeScanDlg : public CDialog
    {
    .....
    public:
    CBarcodeScan m_barcodeScan;
    ....
    protected:
    LRESULT OnBarcodeNotify(WPARAM wParam,LPARAM lPararm);
    ....
    }
     
    #define WM_BARCODE_NOTIFY (WM_USER+0x1000)BEGIN_MESSAGE_MAP(CMonitorBarcodeScanDlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_MESSAGE(WM_BARCODE_NOTIFY,OnBarcodeNotify)    //条码通知消息映射
    END_MESSAGE_MAP()LRESULT CMonitorBarcodeScanDlg::OnBarcodeNotify(WPARAM wParam,LPARAM lPararm)
    {
    m_combox.AddString(m_barcodeScan.GetBarCode());
    return 0;
    }void CMonitorBarcodeScanDlg::OnOK()
    {// CDialog::OnOK();
    }