如何响应条码机

scorpions001 2005-12-12 09:58:35
在vc中是如何响应条码机的,怎样把条码机读取的内容显示在List Control中。还请大虾指教。谢了
...全文
286 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
longx 2005-12-19
  • 打赏
  • 举报
回复
使用这个类:

在你的 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();
}

longx 2005-12-19
  • 打赏
  • 举报
回复
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);
}
}
longx 2005-12-19
  • 打赏
  • 举报
回复
我把代码贴在这里,你自己加进去试试:(条码扫描仪有可能需要进行设置,好像是有关回车键的设置,忘了):

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;
};

scorpions001 2005-12-14
  • 打赏
  • 举报
回复
我的邮箱:scorpions001@tom.com。先谢了
longx 2005-12-14
  • 打赏
  • 举报
回复
我提取了以前一段代码作了一个测试(EAN13码的) ,你可以先测试测试(我这边没有环境),怎么给你呢?
scorpions001 2005-12-13
  • 打赏
  • 举报
回复
高手们帮忙看看吧
scorpions001 2005-12-13
  • 打赏
  • 举报
回复
大家帮忙看看,我用如下函数却只能得到条码的第一个数,而且怎么改才能判断是键盘输入还是条码机输入呢?请高手帮忙改改
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);
}
scorpions001 2005-12-13
  • 打赏
  • 举报
回复
??还没人回答……
keivn544020 2005-12-12
  • 打赏
  • 举报
回复
告诉楼主一个简单的办法。你在桌面上新建一个文本文件,将光标移入文本内。用扫描抢对条码扫描,看看最后的结果,也许会得到启发
longx 2005-12-12
  • 打赏
  • 举报
回复
条码扫描仪主要有三种接口: 1.RS232 2.共用接盘接口 3.USB外设. 对于RS232,需要编程来监视和读取条码, 对于共用接盘接口,条码信息被转换成相应的键盘消息,具有输入焦点的应用程序会收到键盘输入消息,我们以前的做法是做一个全局keyboard Hook或应用程序级别上 keyboard hook, 监视键盘消息,当有连续的键盘消息(在很短的时间内),并且这些键盘字符能构成完成的条码信息,就产生一条自定义消息,通知窗口(向监视程序注册的窗口)条码信息到达.
zzuu 2005-12-12
  • 打赏
  • 举报
回复
条码机只是相当于一个键盘,所以你应该在界面上放一个edit框,条码机读出条码后还会在字符串后面加一个回车(这个一般是可设置的,可加可不加),如果条码机自动加回车,则你重写OnOK函数,将edit框的内容取出放入list即可。

当然也可不放edit框,而直接接收键盘字符(比如重写OnChar函数等,方法很多),但要考虑到这种情况:条码读不出来的情况,此时应该用手动输入条码,所以还是放一个edit框为好。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧