C#开发ActiveX控件及指纹采集

最近做一个指纹采集和比对的功能,因为公司整个项目是WEB类型的,所以指纹采集的模块要嵌套在网页中,那只有用ActiveX了,以下是一些操作及效果,做个笔记!

新建用户控件,编写CS代码,如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.IO;
using System.Reflection;
 
 
namespace FingerTool
{
     [Guid( "5136CBA1-59B0-4A96-B2DC-64062A81F377" )]
     public partial class FingerToolUC : UserControl,IObjectSafety
     {
         public FingerToolUC()
         {
             InitializeComponent();
         }
         FrmMain fm = null ;
         public void ShowSettingForm()
         {
             if (fm == null )
             {
                 fm = new FrmMain();
             }
             
             fm.ShowDialog();
         }
 
 
         #region 调用JS接口
 
         [ComImport, Guid( "00000118-0000-0000-C000-000000000046" ), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
         public interface IOleClientSite
         {
             void SaveObject();
 
             void GetMoniker(uint dwAssign, uint dwWhichMoniker, object ppmk);
 
             void GetContainer(out IOleContainer ppContainer);
 
             void ShowObject();
 
             void OnShowWindow(bool fShow);
 
             void RequestNewObjectLayout();
 
         }
 
         [ComImport, Guid( "0000011B-0000-0000-C000-000000000046" ), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
         public interface IOleContainer
         {
 
             void EnumObjects([In, MarshalAs(UnmanagedType.U4)] int grfFlags,
 
              [Out, MarshalAs(UnmanagedType.LPArray)] object[] ppenum);
 
             void ParseDisplayName([In, MarshalAs(UnmanagedType.Interface)] object pbc,
 
              [In, MarshalAs(UnmanagedType.BStr)] string pszDisplayName,
 
              [Out, MarshalAs(UnmanagedType.LPArray)] int [] pchEaten,
 
              [Out, MarshalAs(UnmanagedType.LPArray)] object[] ppmkOut);
 
             void LockContainer([In, MarshalAs(UnmanagedType.I4)] int fLock);
 
         }
 
         #endregion
 
         #region IE 安全接口
         private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}" ;
         private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}" ;
         private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}" ;
         private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}" ;
         private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}" ;
 
         private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001 ;
         private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002 ;
         private const int S_OK = 0 ;
         private const int E_FAIL = unchecked(( int ) 0x80004005 );
         private const int E_NOINTERFACE = unchecked(( int ) 0x80004002 );
 
         private bool _fSafeForScripting = true ;
         private bool _fSafeForInitializing = true ;
         public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions)
         {
             int Rslt = E_FAIL;
             string strGUID = riid.ToString( "B" );
             pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
             switch (strGUID)
             {
                 case _IID_IDispatch:
                 case _IID_IDispatchEx:
                     Rslt = S_OK;
                     pdwEnabledOptions = 0 ;
                     if (_fSafeForScripting == true )
                         pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
                     break ;
                 case _IID_IPersistStorage:
                 case _IID_IPersistStream:
                 case _IID_IPersistPropertyBag:
                     Rslt = S_OK;
                     pdwEnabledOptions = 0 ;
                     if (_fSafeForInitializing == true )
                         pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
                     break ;
                 default :
                     Rslt = E_NOINTERFACE;
                     break ;
             }
 
             return Rslt;
         }

 

指纹采集关键代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
private void axZKFPEngX1_OnImageReceived(object sender, AxZKFPEngXControl.IZKFPEngXEvents_OnImageReceivedEvent e)
         {
             if (!e.aImageValid) return ;
             if (axZKFPEngX1.IsDisposed) return ;
             try
             {
                 if (pictureBox1.Image != null )
                 {
                     pictureBox1.Image.Dispose(); //释放文件资源
                     pictureBox1.Image = null ; //清除图片
                 }
                 if (!System.IO.Directory.Exists(mvPath))
                 {
                     System.IO.Directory.CreateDirectory(mvPath);
                 }
 
                 string FilePath = mvPath + "\\" + Guid.NewGuid().ToString() + ".bmp" ;
 
                 axZKFPEngX1.SaveBitmap(FilePath); //保存新文件
                 pictureBox1.Image = System.Drawing.Bitmap.FromFile(FilePath); //显示图片
                 pictureBox1.Refresh();
 
                 if ( this .txtValue.Text.Trim() != "" )
                 {
                     SetMsg( "" , "Control" );
                 }
             }
             catch (Exception ex)
             {
                 MessageBox.Show(ex.Message);
             }
         }
 
    private void axZKFPEngX1_OnFeatureInfo(object sender, AxZKFPEngXControl.IZKFPEngXEvents_OnFeatureInfoEvent e)
         {
             string sTemp = "" ;
             if (axZKFPEngX1.IsRegister)
             {
                 sTemp = "登记状态:还需要按压:" + (axZKFPEngX1.EnrollIndex - 1 ).ToString() + "次指纹 " ;
             }
 
             sTemp = sTemp + "指纹质量" ;
 
             if (e.aQuality != 0 )
             {
                 if (e.aQuality == 1 )
                 {
                     sTemp = sTemp + "特征点不够" ;
                 }
                 else
                 {
                     sTemp = sTemp + "其它原因导致不能取到指纹特征" ;
                 }
             }
             else
             {
                 sTemp = sTemp + "合格" ;
 
             }
             this .lblMessage.Text = sTemp;
         }

指纹校验部分,最后保存起来的指纹是转换之后的BASE64字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
string Value_Old= "" ; //已经登记的指纹
string Value_Curr= "" ; //当前的指纹
 
  bool IsOK = false ;
             bool bRegChange = false ;
 
             if (axZKFPEngX1.VerFingerFromStr(ref Value_Old, Value_Curr, false , ref bRegChange))
             {
                 IsOK = true ;
             }
             if (axZKFPEngX1.VerFingerFromStr(ref Value_Old2, Value_Curr, false , ref bRegChange))
             {
                 IsOK = true ;
             }
 
             if (IsOK)
             {
                 MessageBox.Show( "OK" );
             }
             else
             {
                 MessageBox.Show( "NG" );
 
             }

设置项目的COM属性

图片

在页面中注册此插件

图片

图片

图片

图片

图片

图片

图片

图片

图片

采集指纹的次数可以自定义,默认为采集三次之后保存,设备是中控的采集器。

参考页面:http://qingqingquege.cnblogs.com/p/5933752.html

posted on 2017-04-28 16:32  wuqian1  阅读(502)  评论(0编辑  收藏  举报

导航