在vc中是如何响应条码机的,怎样把条码机读取的内容显示在List Control中。还请大虾指教。谢了
解决方案 »
- 返回值为鼠标的XY.还要转换成图像识别的行列
- 关于edit的外部输入
- 请问建立的一个对话框资源怎样像CControlBar那样显示在窗口前面?
- 请问操作EXCEL到底有些什么方法?
- 怎么在列表视图加一个选择框?
- WM_TRAY和WM_TRAY_CALLBACK是用处是?它们有什么区别?
- 枚举sql server服务器名
- 有南京的有PlatformSDK吗?
- 线程的问题!!!
- Windows编程新手问:windows本身是用C++编写的吗?如果不是那它到底是用什么语言编写的??
- 关于继承CTreeCtrl类后,怎样能在初始化控件时同时加入ITEM
- 请教一个关于COM套间的问题(彻底解决我会200分伺候)
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);
}
#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;
};
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);
}
}
{
.....
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();
}