ZBLOG

twaindsm.dll 设置回调扫描图片,获取图片信息保存在本地实例 twain2.4

在TWAIN 2.4规范中,你可以使用twaindsm.dll来设置回调函数、扫描图片并将图片信息保存到本地。以下是一个基本的示例代码:

#include <windows.h>
#include <twain.h>

// 定义回调函数
TW_UINT16 FAR PASCAL TwainCallback(pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
                                   TW_UINT32 uiMsg, TW_MEMREF pData)
{
    switch (uiMsg) {
        case MSG_XFERREADY: {
            // 接收图像数据
            pTW_IMAGEINFO pInfo = new TW_IMAGEINFO;
            
            // 获取图像信息
            TW_UINT16 status = DSM_Entry(&appID, &srcID, DG_IMAGE, DAT_IMAGEINFO,
                                         MSG_GET, (TW_MEMREF)pInfo);
            
            if (status == TWRC_SUCCESS) {
                // 保存图像到文件
                std::string filename = "image.jpg";  // 图像保存路径和文件名
                
                // 创建一个DIB(设备无关位图)
                HGLOBAL hDIB = GlobalAlloc(GHND | GMEM_SHARE, pInfo->ImageWidth * pInfo->ImageLength * 3);
                LPBYTE lpDIB = (LPBYTE)GlobalLock(hDIB);
                
                // 获取图像数据
                status = DSM_Entry(&appID, &srcID, DG_IMAGE, DAT_IMAGENATIVEXFER,
                                   MSG_GET, (TW_MEMREF)lpDIB);
                                   
                if (status == TWRC_SUCCESS) {
                    // 将图像数据写入文件
                    
                    HANDLE hFile = CreateFileA(filename.c_str(), GENERIC_WRITE,
                                              FILE_SHARE_READ, NULL, CREATE_ALWAYS,
                                              FILE_ATTRIBUTE_NORMAL, NULL);
                    
                    if (hFile != INVALID_HANDLE_VALUE) {
                        DWORD bytesWritten;
                        WriteFile(hFile, lpDIB, pInfo->ImageWidth * pInfo->ImageLength * 3,
                                  &bytesWritten, NULL);
                                  
                        CloseHandle(hFile);
                    }
                }
                
                GlobalUnlock(hDIB);
                GlobalFree(hDIB);
                
                delete pInfo;
            }
            
            // 继续下一次扫描
            DSM_Entry(&appID, &srcID, DG_CONTROL, DAT_USERINTERFACE,
                      MSG_ENABLEDSUIONLY, (TW_MEMREF)&ui);
            
            DSM_Entry(&appID, &srcID, DG_CONTROL, DAT_USERINTERFACE,
                      MSG_ENABLEDSUIONLY, (TW_MEMREF)&ui);
        } break;
        
        // 其他回调消息处理
        
        default:
            break;
    }
    
    return TWRC_SUCCESS;
}

int main()
{
    HWND hWnd = GetDesktopWindow();  // 获取窗口句柄
    
    TW_IDENTITY appID;  // 应用程序标识
    memset(&appID, 0x00, sizeof(TW_IDENTITY));
    
    TW_UINT16 status = DSM_Entry(NULL, NULL, DG_CONTROL,
                                 DAT_PARENT | MSG_OPENDSM,
                                 (TW_MEMREF)&hWnd);
    
    if (status == TWRC_SUCCESS) {
        status = DSM_Entry(NULL,NULL,DG_CONTROL,DAT_IDENTITY,
                           MSG_GETDEFAULT,(TW_MEMREF)&appID);

        if (status == TWRC_SUCCESS) {
            status = DSM_Entry(&appID,NULL,DG_CONTROL,DAT_USERINTERFACE,
                               MSG_ENABLEDS,NULL);

            if (status == TWRC_SUCCESS) {
                pTW_EVENT twEvent = new TW_EVENT;
                
                // 设置回调函数
                twEvent->pfnDSMCallback = TwainCallback;
                
                // 打开数据源
                status = DSM_Entry(&appID,NULL,DG_CONTROL,DAT_IDENTITY,
                                   MSG_USERSELECT,(TW_MEMREF)NULL);

                if (status == TWRC_SUCCESS) {
                    while (true) {
                        // 处理消息循环,等待扫描完成的回调
                        
                        // 可以使用Sleep()或其他机制来降低CPU占用率
                    }
                    
                    // 关闭数据源
                    DSM_Entry(&appID, NULL, DG_CONTROL, DAT_PARENT,
                              MSG_CLOSEDSM, (TW_MEMREF)&hWnd);
                }
                
                delete twEvent;
            }
        }

        // 关闭数据源管理器
        DSM_Entry(NULL, NULL, DG_CONTROL, DAT_PARENT | MSG_CLOSEDSM,
                  (TW_MEMREF)&hWnd);
    }
    
    return 0;
}

请注意,上述代码只是一个基本示例,具体的实现细节可能会因不同的设备驱动程序、编译环境和操作系统而有所变化。确保在使用之前先阅读并理解相关的TWAIN规范和文档,并根据你的需求进行相应的适配和调整。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=16660

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?