我使用VC++.net开发一个掌上电脑小程序,使用了以上函数,想实现的功能是不停的可以用PDA扫描条码,使用以上函数有这个的问题:
有一打开扫描头的时间不定,打开程序可扫描的时间有长有短。还有很容易程序就死机了,重启,比如打开程序都一会儿,不作什么操作,它都会自动死机;
程序大致如下:BOOL CNMS_WHScan_OutCar::OnInitDialog()
{
CDialog::OnInitDialog();

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动

#if defined(HAVE_SCANNER)
// 初始化 Scanner
UM_init();
#endif return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
#if defined(HAVE_SCANNER)
void CNMS_WHScan_OutCar::UM_init()
{
hInst = NULL;
hScanner = NULL;
lpScanBuffer = NULL;
memset(szScannerName, 0, MAX_PATH);
lstrcpy(szScannerName, TEXT("SCN1:")); // default scanner name
dwScanSize = 7095; // default scan buffer size
dwScanTimeout = 2000; // default timeout value (0 means no timeout)
bUseText = TRUE;
bTriggerFlag = FALSE;
bRequestPending = FALSE;
bStopScanning = FALSE;
bContinuousMode = FALSE;
// UM_startScanning();

::PostMessage(m_hWnd, UM_STARTSCANNING, 0, 0L); 
}void CNMS_WHScan_OutCar::UM_errorExit(HWND hwnd, UINT uID, LPTSTR szFunc)
{
TCHAR szMsg[256];
TCHAR szBuf[256]; if (szFunc == NULL)
wcscpy(szMsg, UM_loadMsg(uID, szBuf, countof(szBuf)));
else
wsprintf(szMsg, TEXT("%s %s"), szFunc, 
UM_loadMsg(uID, szBuf, countof(szBuf)));
//::MessageBox(NULL, szMsg, NULL, MB_OK);

::PostMessage(m_hWnd,UM_STOPSCANNING,0,0L);
}void CNMS_WHScan_OutCar::UN_stopScanning()
{
if (!bStopScanning && bRequestPending)
SCAN_Flush(hScanner); if (!bRequestPending)
{  
SCAN_Disable(hScanner); if (lpScanBuffer)
SCAN_DeallocateBuffer(lpScanBuffer); SCAN_Close(hScanner); ::EndDialog(UM_hwnd, 0);
}
bStopScanning = TRUE;
}BOOL CNMS_WHScan_OutCar::PreTranslateMessage(MSG *pMsg)
{
if(pMsg->message==WM_INITDIALOG||pMsg->message==UM_STARTSCANNING||pMsg->message==UM_STOPSCANNING||pMsg->message==WM_ACTIVATE||pMsg->message==UM_SCAN||pMsg->message==WM_ACTIVATE||(pMsg->message==WM_ACTIVATE==WM_COMMAND&&(pMsg->wParam==IDC_BUTTON_SOFTTRIGGER||pMsg->wParam==IDC_CONTINUOUS||pMsg->wParam==IDCANCEL))
{
BasicScanProc(pMsg->hwnd, pMsg->message, pMsg->wParam, pMsg->lParam);
return CDialog::PreTranslateMessage(pMsg);
}
else
{
return TRUE;
}
}LPTSTR CNMS_WHScan_OutCar::UM_loadMsg(UINT uID, LPTSTR lpBuffer, int nBufSize)
{
if (!LoadString(hInst, uID, lpBuffer, nBufSize))
wcscpy(lpBuffer, TEXT(""));
//UN_stopScanning();
return lpBuffer;
}
#endifLRESULT CALLBACK CNMS_WHScan_OutCar::BasicScanProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
DWORD dwResult;
TCHAR szMsgBuf[256];
LPSCAN_BUFFER lpScanBuf;
HWND hctl_data; switch(uMsg)
    {
case WM_INITDIALOG: ::PostMessage(hwnd,UM_STARTSCANNING,0,0L);
break; case UM_STARTSCANNING:
dwResult = SCAN_Open(szScannerName, &hScanner);
if ( dwResult != E_SCN_SUCCESS )
{
UM_errorExit(UM_hwnd, IDS_FAILURE, TEXT("SCAN_Open"));
break;
} dwResult = SCAN_Enable(hScanner);
if ( dwResult != E_SCN_SUCCESS )
{
UM_errorExit(UM_hwnd, IDS_FAILURE, TEXT("SCAN_Enable"));
break;
} lpScanBuffer = SCAN_AllocateBuffer(bUseText, dwScanSize);
if (lpScanBuffer == NULL)
{
UM_errorExit(UM_hwnd, IDS_FAILURE, TEXT("SCAN_AllocateBuffer"));
return TRUE;
} dwResult = SCAN_ReadLabelMsg(hScanner,
 lpScanBuffer,
 hwnd,
 UM_SCAN,
 500,
 NULL);
if ( dwResult != E_SCN_SUCCESS )
UM_errorExit(UM_hwnd, IDS_FAILURE, TEXT("SCAN_ReadLabelMsg"));
else
bRequestPending = TRUE;

break;
return TRUE; case UM_STOPSCANNING:
if (!bStopScanning && bRequestPending)
SCAN_Flush(hScanner); if (!bRequestPending)
{  
SCAN_Disable(hScanner); if (lpScanBuffer)
SCAN_DeallocateBuffer(lpScanBuffer); SCAN_Close(hScanner); ::EndDialog(hwnd, 0);
}
bStopScanning = TRUE; return TRUE; case WM_ACTIVATE:
switch(LOWORD(wParam))
{
case WA_INACTIVE:
hctl_data = ::GetDlgItem(hwnd,IDC_EDIT_DATA);
::Edit_SetText(hctl_data, UM_loadMsg(IDS_INACTIVE,szMsgBuf, countof(szMsgBuf)));

if (bRequestPending)
dwResult = SCAN_Flush(hScanner);
break;

default: // activating
hctl_data = ::GetDlgItem(hwnd,IDC_EDIT_DATA);
::Edit_SetText(hctl_data, UM_loadMsg(IDS_READY,szMsgBuf, countof(szMsgBuf))); if (!bRequestPending && lpScanBuffer != NULL && !bStopScanning)
{
dwResult = SCAN_ReadLabelMsg(hScanner,
 lpScanBuffer,
 hwnd,
 UM_SCAN,
 dwScanTimeout,
 NULL);

if ( dwResult != E_SCN_SUCCESS )
UM_errorExit(UM_hwnd, IDS_FAILURE, TEXT("SCAN_ReadLabelMsg"));
else
bRequestPending = TRUE;
}
break;
}
break; case UM_SCAN: bRequestPending = FALSE; // Clear the soft trigger
bTriggerFlag = FALSE;
SCAN_SetSoftTrigger(hScanner,&bTriggerFlag); // Get scan result from the scan buffer, and display it
lpScanBuf = (LPSCAN_BUFFER)lParam;
if ( lpScanBuf == NULL )
UM_errorExit(UM_hwnd, IDS_ERR_BUF, 0); hctl_data = ::GetDlgItem(hwnd,IDC_EDIT_DATA); switch (SCNBUF_GETSTAT(lpScanBuf))

case E_SCN_DEVICEFAILURE:
::Edit_SetText(hctl_data, UM_loadMsg(IDS_DEVICE_FAILURE,szMsgBuf, countof(szMsgBuf)));
break; case E_SCN_READPENDING:
::Edit_SetText(hctl_data, UM_loadMsg(IDS_READ_PENDING,szMsgBuf, countof(szMsgBuf)));
break; case E_SCN_READCANCELLED: if (bStopScanning)
{ // complete the second step of UM_STOPSCANNING
::SendMessage(hwnd, UM_STOPSCANNING, 0, 0L);
return TRUE;
}
if (!GetFocus())
break; // Do nothing if read was cancelled while deactivation ::Edit_SetText(hctl_data, UM_loadMsg(IDS_READ_PENDING,szMsgBuf, countof(szMsgBuf)));
break; case E_SCN_READTIMEOUT:
if(bContinuousMode)
::PostMessage(hwnd,WM_COMMAND,IDC_BUTTON_SOFTTRIGGER,0L);
break;

case E_SCN_SUCCESS:
::Edit_SetText(hctl_data, (LPTSTR)SCNBUF_GETDATA(lpScanBuffer)); CString BTempStr=_T("");

m_WHSOutCar_Barcode.GetWindowTextW(BTempStr);
if(sizeof(lpScanBuffer)>0&&BTempStr.Compare(_T("■■■■■■■■"))!=0)
{
m_WHSOutCar_Barcode.SetWindowTextW((LPTSTR)SCNBUF_GETDATA(lpScanBuffer));
OnBnClickedWhsoutcarSave();//保存入库信息
} if(bContinuousMode)
::PostMessage(hwnd,WM_COMMAND,IDC_BUTTON_SOFTTRIGGER,0L);
break;
} if (GetFocus())
{
dwResult = SCAN_ReadLabelMsg(hScanner,
 lpScanBuffer,
 hwnd,
 uMsg,
 dwScanTimeout,
 NULL);

if ( dwResult != E_SCN_SUCCESS )
UM_errorExit(UM_hwnd, IDS_FAILURE, TEXT("SCAN_ReadLabelMsg"));
else
bRequestPending = TRUE;
} return TRUE; case WM_COMMAND:
switch (LOWORD(wParam))
            {
case IDC_BUTTON_SOFTTRIGGER:
// Clear the state first before we set it to TRUE
bTriggerFlag = FALSE;
SCAN_SetSoftTrigger(hScanner,&bTriggerFlag); bTriggerFlag = TRUE;
SCAN_SetSoftTrigger(hScanner,&bTriggerFlag); break;
case IDC_CONTINUOUS: //Check for Continuous Scan Mode
bContinuousMode = !bContinuousMode;
if(bContinuousMode)
::PostMessage(hwnd,WM_COMMAND,IDC_BUTTON_SOFTTRIGGER,0L);
break; case IDOK: // fall through case IDCANCEL:
::SendMessage(hwnd,UM_STOPSCANNING,0,0L);
break;
}
return TRUE;
}
//return FALSE;
return TRUE;
}

解决方案 »

  1.   

    发消息用PostMessage而不用SendMessage,不用返回调用点;
    试着用多线程来解决。
      

  2.   

    [200]分很急的请问各位一个消息处理问题:PreTranslateMessage(MSG *pMsg),很急的请求帮助,谢谢!我使用VC++.net开发一个掌上电脑小程序,使用了以上函数,想实现的功能是不停的可以用PDA扫描条码,使用以上函数有这个的问题:
    有一打开扫描头的时间不定,打开程序可扫描的时间有长有短。还有很容易程序就死机了,重启,比如打开程序都一会儿,不作什么操作,它都会自动死机;
    程序大致如下:BOOL CNMS_WHScan_OutCar::OnInitDialog()
    {
    CDialog::OnInitDialog();

    #if defined(HAVE_SCANNER)
    // 初始化 Scanner
    UM_init();
    #endifreturn TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }
    #if defined(HAVE_SCANNER)
    void CNMS_WHScan_OutCar::UM_init()
    {
    ...............
    ::PostMessage(m_hWnd, UM_STARTSCANNING, 0, 0L); 
    }void CNMS_WHScan_OutCar::UM_errorExit(HWND hwnd, UINT uID, LPTSTR szFunc)
    {
    ........
    ::PostMessage(m_hWnd,UM_STOPSCANNING,0,0L);
    }BOOL CNMS_WHScan_OutCar::PreTranslateMessage(MSG *pMsg)
    {
    BasicScanProc(pMsg->hwnd, pMsg->message, pMsg->wParam, pMsg->lParam);
    return CDialog::PreTranslateMessage(pMsg);
    }LPTSTR CNMS_WHScan_OutCar::UM_loadMsg(UINT uID, LPTSTR lpBuffer, int nBufSize)
    {
    if (!LoadString(hInst, uID, lpBuffer, nBufSize))
    wcscpy(lpBuffer, TEXT(""));
    return lpBuffer;
    }
    #endifLRESULT CALLBACK CNMS_WHScan_OutCar::BasicScanProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    .....
    switch(uMsg)
    {
    case WM_INITDIALOG:
    ::PostMessage(hwnd,UM_STARTSCANNING,0,0L);
    break;
    case UM_STARTSCANNING:
    dwResult = SCAN_Open(szScannerName, &hScanner);
    ......
    break;
    return TRUE;
    case UM_STOPSCANNING:
    ......
    bStopScanning = TRUE;
    return TRUE;
    case WM_ACTIVATE:
    switch(LOWORD(wParam))
    {
    case WA_INACTIVE:
    break;
    default:
    ...
    break;
    case UM_SCAN:
    switch (SCNBUF_GETSTAT(lpScanBuf))

    case E_SCN_SUCCESS:
    ::Edit_SetText(hctl_data, (LPTSTR)SCNBUF_GETDATA(lpScanBuffer));
    if(bContinuousMode)
    ::PostMessage(hwnd,WM_COMMAND,IDC_BUTTON_SOFTTRIGGER,0L);
    break;
    }
    return TRUE;
    case WM_COMMAND:
    switch (LOWORD(wParam))
            {
    case IDC_BUTTON_SOFTTRIGGER:
    .......
    break;
    case IDCANCEL:
    ::SendMessage(hwnd,UM_STOPSCANNING,0,0L);
    break;
    }
    return TRUE;
    }
    return FALSE;
    }
      

  3.   

    发一个贴子就好了哦, 我就回到下面吧:
    http://community.csdn.net/Expert/TopicView1.asp?id=5139224