using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using EntityDataSet;
using IntelligentControlForsx.Service.FingerSvc;
using IntelligentControlForsx.Service.WindturbineControl.Domain.Cmd;
using libzkfpcsharp;
namespace IntelligentControlForsx.ChildForms
{
public partial class Register : Form
{
#region 指纹读取常用量
bool bIsTimeToDie = false;
IntPtr mDevHandle = IntPtr.Zero;
IntPtr mDBHandle = IntPtr.Zero;
IntPtr FormHandle = IntPtr.Zero;
const int MESSAGE_CAPTURED_OK = 0x0400 + 6;
byte[] FPBuffer;//返回图像
private byte[] fingerTemp = new byte[2048];//指纹模板
int fingerTempLength = 2048;//实际返回指纹模板长度
private int mfpWidth = 0;//图片宽度
private int mfpHeight = 0;//图片高度
byte[] finger1 = new byte[2048];
byte[] finger2 = new byte[2048];
byte[] finger3 = new byte[2048];
byte[] registResultFinger = new byte[2048];//最终结果模板
int iFid = 1;//指纹编号
private int pushFingerCount = 0;
byte[] dataBaseTemp = new byte[2048];
#endregion
private UserSvc userSvc;
//获取路径
string homeStr = "";
public Register()
{
InitializeComponent();
homeStr = Application.StartupPath;
userSvc = UserSvc.GetUserSvc();
userSvc.InitUser();
FingerInit();
StartsScanning();
picFinger1.Image = Image.FromFile(homeStr + @"\images\finger.gif");
}
private void Register_Load(object sender, EventArgs e)
{
FormHandle = this.Handle;
}
private void btnSubmit_Click(object sender, EventArgs e)
{
string name = txtName.Text.Trim();
string tel = txtTel.Text.Trim();
string userName = txtUserName.Text.Trim();
string passWord = txtPassWord.Text.Trim();
if (string.IsNullOrEmpty(name))
{
lblInfo.Text = "请输入姓名";
return;
}
if (string.IsNullOrEmpty(tel))
{
lblInfo.Text = "请输入电话";
return;
}
if (string.IsNullOrEmpty(userName))
{
lblInfo.Text = "请输入用户名";
return;
}
if (string.IsNullOrEmpty(passWord))
{
lblInfo.Text = "请输入密码";
return;
}
user dbUser = userSvc.LoginUserCheck(mDBHandle, registResultFinger);
if (dbUser != null)
{
MessageBox.Show("您已注册,不能重复注册");
return;
}
user newUser = new user();
newUser.name = name;
newUser.telephone = tel;
newUser.user_name = userName;
newUser.pass_word = passWord;
newUser.finger1_template = registResultFinger;
int count = userSvc.RegisterUser(newUser);
if (count > 0)
{
MessageBox.Show("注册成功");
zkfp2.Terminate();
zkfp2.CloseDevice(mDevHandle);
zkfp2.CloseDevice(mDBHandle);
this.Dispose();
}
else
{
MessageBox.Show("注册失败,请重置并重新注册");
}
}
///
/// 初始化指纹设备
///
private void FingerInit()
{
int ret = zkfperrdef.ZKFP_ERR_OK;
if ((ret = zkfp2.Init()) == zkfperrdef.ZKFP_ERR_OK)
{
int nCount = zkfp2.GetDeviceCount();
if (nCount <= 0)
{
zkfp2.Terminate();
MessageBox.Show("找不到设备,请检查指纹刷是否连接");
}
}
else
{
MessageBox.Show("指纹输入设备初始化失败,请检查指纹刷是否连接");
}
}
///
/// 打开扫描
///
private void StartsScanning()
{
Console.WriteLine("设备初始化");
int ret = zkfp.ZKFP_ERR_OK;
if (IntPtr.Zero == (mDevHandle = zkfp2.OpenDevice(0)))
{
MessageBox.Show("打开扫描失败");
return;
}
if (IntPtr.Zero == (mDBHandle = zkfp2.DBInit()))
{
MessageBox.Show("打开扫描失败");
zkfp2.CloseDevice(mDevHandle);
mDevHandle = IntPtr.Zero;
return;
}
byte[] paramValue = new byte[4];
int size = 4;
zkfp2.GetParameters(mDevHandle, 1, paramValue, ref size);
zkfp2.ByteArray2Int(paramValue, ref mfpWidth);
size = 4;
zkfp2.GetParameters(mDevHandle, 2, paramValue, ref size);
zkfp2.ByteArray2Int(paramValue, ref mfpHeight);
FPBuffer = new byte[mfpWidth * mfpHeight];
Thread captureThread = new Thread(new ThreadStart(DoCapture));
captureThread.IsBackground = true;
captureThread.Start();
bIsTimeToDie = false;
}
///
/// 指纹扫描线程
///
private void DoCapture()
{
while (!bIsTimeToDie)
{
fingerTempLength = 2048;
int ret = zkfp2.AcquireFingerprint(mDevHandle, FPBuffer, fingerTemp, ref fingerTempLength);
if (ret == zkfp.ZKFP_ERR_OK)
{
if (pushFingerCount == 0)
{
finger1 = (byte[])fingerTemp.Clone();
Console.WriteLine("手指1");
FingerReadSvc.SendMessage(FormHandle, MESSAGE_CAPTURED_OK, IntPtr.Zero, IntPtr.Zero);
}
else if (pushFingerCount == 1)
{
finger2 = (byte[])fingerTemp.Clone();
Console.WriteLine("手指2");
FingerReadSvc.SendMessage(FormHandle, MESSAGE_CAPTURED_OK, IntPtr.Zero, IntPtr.Zero);
}
else if (pushFingerCount == 2)
{
finger3 = (byte[])fingerTemp.Clone();
Console.WriteLine("手指3");
FingerReadSvc.SendMessage(FormHandle, MESSAGE_CAPTURED_OK, IntPtr.Zero, IntPtr.Zero);
}
else
{
FingerReadSvc.SendMessage(FormHandle, MESSAGE_CAPTURED_OK, IntPtr.Zero, IntPtr.Zero);
}
}
Thread.Sleep(200);
}
}
protected override void DefWndProc(ref Message m)
{
switch (m.Msg)
{
case MESSAGE_CAPTURED_OK:
{
MemoryStream ms = new MemoryStream();
BitmapFormat.GetBitmap(FPBuffer, mfpWidth, mfpHeight, ref ms);
BitmapFormat.WriteBitmap(FPBuffer, mfpWidth, mfpHeight);
Bitmap bmp = new Bitmap(ms);
int ret = zkfp.ZKFP_ERR_OK;
int fid = 0, score = 0;
if (pushFingerCount == 0)
{
ret = zkfp2.DBIdentify(mDBHandle, finger1, ref fid, ref score);
pushFingerCount = 1;
lblInfo.Text = "指纹第一次录入成功,请再次输入指纹";
this.picFinger1.Image = bmp;
picFinger2.Image = Image.FromFile(homeStr + @"\images\finger.gif");
}
else if (pushFingerCount == 1)
{
int compareScore = zkfp2.DBMatch(mDBHandle, finger1, finger2);
if (compareScore <= 0)
{
lblInfo.Text = "请连续三次输入相同手指的指纹";
finger1 = new byte[2048];
finger2 = new byte[2048];
finger3 = new byte[2048];
pushFingerCount = 0;
picFinger1.Image = Image.FromFile(homeStr + @"\images\finger.gif");
picFinger2.Image = Image.FromFile(homeStr + @"\images\finger_static.png");
picFinger3.Image = Image.FromFile(homeStr + @"\images\finger_static.png");
}
else
{
pushFingerCount = 2;
lblInfo.Text = "指纹第二次录入成功,请再次输入指纹";
this.picFinger2.Image = bmp;
picFinger3.Image = Image.FromFile(homeStr + @"\images\finger.gif");
}
}
else if (pushFingerCount == 2)
{
int compareScore = zkfp2.DBMatch(mDBHandle, finger3, finger2);
if (compareScore <= 0)
{
lblInfo.Text = "请连续三次输入相同手指的指纹";
finger1 = new byte[2048];
finger2 = new byte[2048];
finger3 = new byte[2048];
pushFingerCount = 0;
picFinger1.Image = Image.FromFile(homeStr + @"\images\finger.gif");
picFinger2.Image = Image.FromFile(homeStr + @"\images\finger_static.png");
picFinger3.Image = Image.FromFile(homeStr + @"\images\finger_static.png");
}
else
{
pushFingerCount = 3;
lblInfo.Text = "指纹第三次录入成功";
this.picFinger3.Image = bmp;
}
}
else
{
//txtInfo.Text = "未知错误";
}
if (pushFingerCount == 3)
{
int ret1 = zkfp2.DBMerge(mDBHandle, finger1, finger2, finger3, registResultFinger,
ref pushFingerCount);
int ret2 = zkfp2.DBAdd(mDBHandle, iFid, registResultFinger);
if (ret1 == zkfp.ZKFP_ERR_OK && ret2 == zkfp.ZKFP_ERR_OK)
{
btnSubmit.Enabled = true;
}
}
}
break;
default:
base.DefWndProc(ref m);
break;
}
}
private void btnClose_Click(object sender, EventArgs e)
{
zkfp2.Terminate();
zkfp2.CloseDevice(mDevHandle);
zkfp2.CloseDevice(mDBHandle);
this.Dispose();
}
private void txtName_TextChanged(object sender, EventArgs e)
{
string name = txtName.Text.Trim();
string tel = txtTel.Text.Trim();
if (!string.IsNullOrWhiteSpace(name) && !string.IsNullOrEmpty(tel))
{
//FingerInit();
//StartsScanning();
//string homeStr = Application.StartupPath;
//picFinger1.Image = Image.FromFile(homeStr + @"\images\finger.gif");
}
}
private void txtTel_TextChanged(object sender, EventArgs e)
{
string name = txtName.Text.Trim();
string tel = txtTel.Text.Trim();
if (!string.IsNullOrWhiteSpace(name) && !string.IsNullOrEmpty(tel))
{
//FingerInit();
//StartsScanning();
//string homeStr = Application.StartupPath;
//picFinger1.Image = Image.FromFile(homeStr + @"\images\finger.gif");
}
}
private void btnRest_Click(object sender, EventArgs e)
{
txtName.Text = "";
txtTel.Text = "";
finger1 = new byte[2048];
finger2 = new byte[2048];
finger3 = new byte[2048];
registResultFinger = new byte[2048];
pushFingerCount = 0;
picFinger1.Image = Image.FromFile(homeStr + @"\images\finger.gif");
picFinger2.Image = Image.FromFile(homeStr + @"\images\finger_static.png");
picFinger3.Image = Image.FromFile(homeStr + @"\images\finger_static.png");
}
}
}