// EvcSymbolTest.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "resource.h"
#include <windows.h>
#include <windowsx.h>
#include <ScanCAPI.h>
#include <stdio.h>
#include <string.h>
#include <wchar.h>
#define countof(x) sizeof(x)/sizeof(x[0])

BOOL CALLBACK MAINProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK EditProc(HWND,UINT,WPARAM,LPARAM);
BOOL Save(HWND hwnd_barcode,HWND hwnd_qty);
void InitFormControl(HWND);
WNDPROC PreEditProc[2];

HINSTANCE hInst = NULL;
HANDLE hScanner = NULL;
LPSCAN_BUFFER lpScanBuffer = NULL;
TCHAR szScannerName[MAX_PATH] = TEXT("SCN1:"); // default scanner name
DWORD dwScanSize = 7095; // default scan buffer size
DWORD dwScanTimeout = 0; // default timeout value (0 means no timeout)
BOOL bUseText = TRUE;
BOOL bTriggerFlag = FALSE;
BOOL bRequestPending = FALSE;
BOOL bStopScanning = FALSE;

enum tagUSERMSGS


{
UM_SCAN = WM_USER + 0x200,
UM_STARTSCANNING,
UM_STOPSCANNING
};

int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)


{
int nResult;

hInst = hInstance;
nResult = DialogBoxParamW(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, MAINProc,0L);

return nResult;
}

BOOL CALLBACK MAINProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)


{
DWORD dwResult;
LPSCAN_BUFFER lpScanBuf;
static HWND hctl_temp,hctl_barcode, hctl_qty, hctl_status,hctl_info;
switch(uMsg)

{
case WM_INITDIALOG:
PostMessage(hwnd,UM_STARTSCANNING,0,0L);
hctl_barcode=GetDlgItem(hwnd,IDC_EDIT_Barcode);
hctl_qty=GetDlgItem(hwnd,IDC_EDIT_Qty);
hctl_status=GetDlgItem(hwnd,IDC_STATIC_STATUS);
hctl_info=GetDlgItem(hwnd,IDC_STATIC_INFO);
InitFormControl(hwnd);
//子类化
PreEditProc[0]=(WNDPROC) SetWindowLong (hctl_barcode,
GWL_WNDPROC, (LONG) EditProc) ;
PreEditProc[1]=(WNDPROC) SetWindowLong (hctl_qty,
GWL_WNDPROC, (LONG) EditProc) ;
break;
case UM_STARTSCANNING:
dwResult=SCAN_Open(szScannerName,&hScanner);
if(dwResult!=E_SCN_SUCCESS)

{
MessageBox(hwnd,TEXT("不能打开激光器"),TEXT("提示"),MB_OK);
SendMessage(hwnd,UM_STOPSCANNING,0,0L);
break;
}
dwResult=SCAN_Enable(hScanner);
if(dwResult!=E_SCN_SUCCESS)

{
MessageBox(hwnd,TEXT("激光器不可用"),TEXT("提示"),MB_OK);
SendMessage(hwnd,UM_STOPSCANNING,0,0L);
break;
}
lpScanBuffer = SCAN_AllocateBuffer(bUseText, dwScanSize);
if (lpScanBuffer==NULL)

{
MessageBox(hwnd,TEXT("未能分配扫描缓冲"),TEXT("提示"),MB_OK);
SendMessage(hwnd,UM_STOPSCANNING,0,0L);
return TRUE;
}
//SCAN_ReadLabelMsg扫描成功后向hwnd发送UM_SCAN的消息
dwResult=SCAN_ReadLabelMsg(hScanner,
lpScanBuffer,
hwnd,
UM_SCAN,
dwScanTimeout,
NULL);
if(dwResult!=E_SCN_SUCCESS)

{
MessageBox(hwnd,TEXT("SCAN_ReadLabelMsg发生错误"),TEXT("提示"),MB_OK);
SendMessage(hwnd,UM_STOPSCANNING,0,0L);
}
else

{
//只有到最后成功得到缓存后才置此标志为TRUE
bRequestPending=TRUE;
}
break;
return true;
case UM_STOPSCANNING:
//在未停止扫描且未已正常得到缓存后才执行SCAN_Flush
if (!bStopScanning && bRequestPending)

{
SCAN_Flush(hScanner);
}

if (!bRequestPending)

{
SCAN_Disable(hScanner);

if (lpScanBuffer)
SCAN_DeallocateBuffer(lpScanBuffer);

SCAN_Close(hScanner);

EndDialog(hwnd, 0);
}
bStopScanning = TRUE;
break;
case WM_ACTIVATE:
switch(LOWORD(wParam))

{
case WA_INACTIVE:

if (bRequestPending)

{
dwResult=SCAN_Flush(hScanner);
}
break;
default:
if (!bRequestPending && lpScanBuffer != NULL && !bStopScanning)

{
dwResult=SCAN_ReadLabelMsg(hScanner,
lpScanBuffer,
hwnd,
UM_SCAN,
dwScanTimeout,
NULL);
if (dwResult!=E_SCN_SUCCESS)

{
MessageBox(hwnd,TEXT("SCAN_ReadLabelMsg发生错误"),TEXT("提示"),MB_OK);
SendMessage(hwnd,UM_STOPSCANNING,0,0L);
}
}
break;
}
break;
case UM_SCAN:
bRequestPending=FALSE;
lpScanBuf=(LPSCAN_BUFFER)lParam;
if(lpScanBuf==NULL)

{
MessageBox(hwnd,TEXT("未能正确得到数据"),TEXT("提示"),MB_OK);
SendMessage(hwnd,UM_STOPSCANNING,0,0L);
}
switch(SCNBUF_GETSTAT(lpScanBuf))

{
case E_SCN_SUCCESS:
hctl_temp=GetFocus();
if(hctl_temp==hctl_barcode ||hctl_temp==hctl_qty)

{
Edit_SetText(hctl_temp,(LPTSTR)SCNBUF_GETDATA(lpScanBuffer));
}
else

{
Edit_SetText(hctl_barcode,(LPTSTR)SCNBUF_GETDATA(lpScanBuffer));
SendMessage(hwnd,WM_KEYDOWN,VK_RETURN,NULL);
}
break;
}
if (GetFocus())

{
dwResult = SCAN_ReadLabelMsg(hScanner,
lpScanBuffer,
hwnd,
uMsg,
dwScanTimeout,
NULL);
if ( dwResult != E_SCN_SUCCESS )

{
MessageBox(hwnd,TEXT("SCAN_ReadLabelMsg未能正确得到数据"),TEXT("提示"),MB_OK);
SendMessage(hwnd,UM_STOPSCANNING,0,0L);
}
else
bRequestPending = TRUE;
}
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))

{
case IDCANCEL:
bRequestPending=TRUE;
SendMessage(hwnd,UM_STOPSCANNING,0,0L);
bRequestPending=FALSE;
SendMessage(hwnd,UM_STOPSCANNING,0,0L);
break;
}
return TRUE;
case WM_KEYDOWN:
switch (wParam)

{
case VK_RETURN:
hctl_temp=GetFocus();
if (hctl_temp==hctl_barcode)

{
SetFocus(hctl_qty);
SendMessage(hctl_qty,EM_SETSEL,0,-1);
}
else if (hctl_temp==hctl_qty)

{
if (Save(hctl_barcode,hctl_qty)==TRUE)

{
SetWindowText(hctl_info,TEXT("追加数据成功!"));
InitFormControl(hwnd);
}
else

{
SetWindowText(hctl_info,TEXT("追加数据失败!"));
}
}
else

{
SetFocus(hctl_barcode);
}
break;
case VK_F1:
InitFormControl(hwnd);
break;
case VK_F2:
hctl_temp=GetFocus();
if (hctl_temp==hctl_qty)

{
Edit_SetText(hctl_temp,TEXT("-"));
Edit_SetSel(hctl_temp,1,1);
}
break;
case VK_F3:
break;
}
break;
}

return FALSE;
}

//初始化
void InitFormControl(HWND hwnd)


{
HWND hctl_barcode, hctl_qty;
hctl_barcode=GetDlgItem(hwnd,IDC_EDIT_Barcode);
Edit_SetText(hctl_barcode,TEXT(""));
hctl_qty=GetDlgItem(hwnd,IDC_EDIT_Qty);
Edit_SetText(hctl_qty,TEXT("1"));
SetFocus(hctl_barcode);
}

//子类化文本框
LRESULT CALLBACK EditProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)


{
int id = GetWindowLong (hwnd, GWL_ID) ;
LPMSG msg;
WNDPROC proc;
switch (uMsg)

{
case WM_GETDLGCODE :
msg=(LPMSG) lParam;
switch(msg->message)

{
case WM_KEYDOWN:
switch(msg->wParam)

{
case VK_TAB:
case VK_RETURN:
case VK_F1:
case VK_F2:
case VK_F3:
SendMessage(GetParent(hwnd),msg->message,msg->wParam,msg->lParam);
break;
}
}

/**//*
switch(msg->message)
{
case EN_SETFOCUS:
hctl_qty=GetDlgItem(GetParent(hwnd),IDC_EDIT_Qty);
if (msg->hwnd==hctl_qty)
{
SetDlgItemInt(GetParent(hwnd),IDC_STATIC_STATUS,msg->message,FALSE);
//Edit_SetSel(hwnd,-1,GetWindowTextLength(hwnd));
Edit_SetSel(hwnd,0,-1);
//SNDMSG(hwnd, EM_SETSEL, 0, GetWindowTextLength(hwnd));
}
}
*/
}
if (id==IDC_EDIT_Barcode)

{
proc=PreEditProc[0];
}
else if (id==IDC_EDIT_Qty)

{
proc=PreEditProc[1];
}
return CallWindowProc (proc, hwnd, uMsg, wParam, lParam) ;
}

//保存
BOOL Save(HWND hwnd_barcode,HWND hwnd_qty)


{
int result=FALSE;
FILE * file_handling=NULL;
TCHAR barcode[255],qty[255];
TCHAR buffer[255];
char ansiBuffer[255];
GetWindowText(hwnd_barcode,buffer,sizeof(buffer));
if (!lstrlen (buffer))

{
MessageBox(NULL,TEXT("请扫描或输入条码!"),TEXT("提示"),MB_OK);
SetFocus(hwnd_barcode);
return result;
}
else

{
lstrcpy (barcode,buffer);
}
memset(buffer,0,sizeof(buffer));
GetWindowText(hwnd_qty,buffer,sizeof(buffer));
if (!lstrlen (buffer))

{
MessageBox(NULL,TEXT("请输入数量!"),TEXT("提示"),MB_OK);
SetFocus(hwnd_qty);
return result;
}
else //判断数字

{
}
lstrcpy (qty,buffer);
memset(buffer,0,sizeof(buffer));
swprintf(buffer,TEXT("%s,%s\n"),barcode,qty);
if (file_handling=fopen("\\bar.txt","a+"))

{
#ifdef UNICODE
//将Unicode转换为ANSI
wcstombs(ansiBuffer,buffer,sizeof(ansiBuffer));
result=fwrite(ansiBuffer,sizeof(char),strlen(ansiBuffer),file_handling);
#else
result=fwrite(buffer,sizeof(TCHAR),lstrlen(buffer),file_handling);
#endif
fclose(file_handling);
}
else

{
MessageBox(NULL,TEXT("打开文件失败!"),TEXT("提示"),MB_OK);
}
return result==0?FALSE:TRUE;
}
设备是Symbol(现在被Moto收购了)公司MC50,我弄了三天,其中抄了部分Symbol公司带的SDK中关于扫描条码的部分代码.编写的过程中遇到很多的问题,但还好都一点点解决了.
学习C/C++的路上迈出了第一步,对于C/C++的世界的认知还是很模糊,不知道什么时候才能真正的运用VC来开发,扔了VB和C#.
一点说明:为什么在标题中要嵌入英文?原因是为了能够让国外的网友能查询到这篇文章。平常在Google上查资料的时候,经常参考国外网友的博客,帮助我解决了很多问题,所以我也想让他们能够参考我写的内容。当然文中我不可能全部译为英文,所以我尽量把代码粘全,靠代码说话吧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端