海康威视指纹阅读器SDK:FPModule_InstallMessageHandler调用方法咨询
使用海康威视指纹阅读器SDK的FPModule_InstallMessageHandler步骤
1. 实现消息回调函数
先写一个符合FpMessageHandler委托签名的方法,用来处理SDK发来的各类指纹事件,根据enMsgType区分不同消息,对pMsgData做对应解析:
// 类级别变量,保存委托引用,防止被GC回收 private static FpMessageHandler _fpMsgHandler; private static void HandleFpMessages(FP_MSG_TYPE_T enMsgType, IntPtr pMsgData) { switch (enMsgType) { case FP_MSG_TYPE_T.FP_MSG_PRESS_FINGER: Console.WriteLine("手指已按下,请保持稳定"); break; case FP_MSG_TYPE_T.FP_MSG_RISE_FINGER: Console.WriteLine("手指已抬起"); break; case FP_MSG_TYPE_T.FP_MSG_ENROLL_TIME: Console.WriteLine("正在录入指纹,请不要移动手指"); break; case FP_MSG_TYPE_T.FP_MSG_CAPTURED_IMAGE: if (pMsgData != IntPtr.Zero) { // 将指针转换为FP_IMAGE_DATA结构体 FP_IMAGE_DATA imageData = Marshal.PtrToStructure<FP_IMAGE_DATA>(pMsgData); // 灰度指纹图像的字节长度=宽度*高度 int imageLength = imageData.dwWidth * imageData.dwHeight; // 从内存中复制图像字节数组 imageData.pbyImage = new byte[imageLength]; Marshal.Copy((IntPtr)pMsgData + Marshal.SizeOf<int>() * 2, imageData.pbyImage, 0, imageLength); // 此处可添加图像保存、特征提取等后续逻辑 Console.WriteLine($"捕获指纹图像:{imageData.dwWidth}x{imageData.dwHeight}"); } break; } }
2. 安装消息处理器
在SDK初始化环节(比如设备连接成功后),创建委托实例并传入FPModule_InstallMessageHandler:
// 初始化委托引用 _fpMsgHandler = HandleFpMessages; // 调用SDK方法安装处理器 int result = FPModule_InstallMessageHandler(_fpMsgHandler); // 根据返回值判断是否成功,具体错误码参考SDK文档 if (result != 0) { Console.WriteLine("安装消息处理器失败,错误码:" + result); }
关键注意事项
- 必须保留委托的类级别引用:如果仅在局部变量中创建委托,GC可能会回收它,导致SDK回调时触发异常。
- 图像数据解析要匹配内存结构:原生SDK中
FP_IMAGE_DATA的pbyImage是指针,无法直接通过结构体获取,需用Marshal.Copy从指定内存地址复制数据。 - 程序退出或结束SDK使用时,若SDK提供卸载方法(如
FPModule_UninstallMessageHandler),记得调用以避免内存泄漏。
内容的提问来源于stack exchange,提问作者Coder T
相关产品推荐
相关产品推荐

