using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using DPUruNet;
using System.Threading;
using System.Drawing.Imaging;
namespace Neo.ActiveX.FingerprintReader
{
public delegate void PostFingerprintHandler(string fingerprint);
[GuidAttribute("E11AD111-0F41-4DED-A916-9E7E75C242FD")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
public interface ControlEvents
{
[DispIdAttribute(0x60020010)]
void PostFingerprint(string fingerprint);
}
[Guid("34B11111-FFA3-4181-87FC-AF7F65636762")]
[ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(ControlEvents))]
[ZoneIdentityPermission(SecurityAction.Assert, Zone = System.Security.SecurityZone.Intranet)]
public partial class FingerprintReaderControl : UserControl //, DPFP.Capture.EventHandler
{
public event PostFingerprintHandler PostFingerprint;
private Reader currentReader;
public bool InvokeRequired { get; set; }
public FingerprintReaderControl()
{
InitializeComponent();
currentReader = null;
if (OpenReader())
{
StartCaptureAsync(this.OnCaptured);
}
}
#region OpenReader
public bool OpenReader()
{
var success = false;
try
{
var readers = ReaderCollection.GetReaders();
currentReader = readers[0];
Constants.ResultCode result = Constants.ResultCode.DP_DEVICE_FAILURE;
result = currentReader.Open(Constants.CapturePriority.DP_PRIORITY_COOPERATIVE);
if (result != Constants.ResultCode.DP_SUCCESS)
{
SetStatus("Can't open the reader. " + result);
}
else
{
SetStatus("Place your finger on the fingerprint reader to log in...");
success = true;
}
}
catch
{
SetStatus("Can't open the reader.");
}
return success;
}
#endregion
#region StartCaptureAsync
public bool StartCaptureAsync(Reader.CaptureCallback OnCaptured)
{
// Activate capture handler
currentReader.On_Captured += new Reader.CaptureCallback(OnCaptured);
// Call capture
if (!CaptureFingerAsync())
{
return false;
}
return true;
}
#endregion
#region GetStatus
//
/// Check the device status before starting capture.
///
///
public void GetStatus()
{
Constants.ResultCode result = currentReader.GetStatus();
if ((result != Constants.ResultCode.DP_SUCCESS))
{
SetStatus("" + result);
}
if ((currentReader.Status.Status == Constants.ReaderStatuses.DP_STATUS_BUSY))
{
Thread.Sleep(50);
}
else if ((currentReader.Status.Status == Constants.ReaderStatuses.DP_STATUS_NEED_CALIBRATION))
{
currentReader.Calibrate();
}
else if ((currentReader.Status.Status != Constants.ReaderStatuses.DP_STATUS_READY))
{
SetStatus("Reader Status - " + currentReader.Status.Status);
}
}
#endregion
#region CaptureFingerAsync
///
/// Function to capture a finger. Always get status first and calibrate or wait if necessary. Always check status and capture errors.
///
///
///
public bool CaptureFingerAsync()
{
try
{
GetStatus();
Constants.ResultCode captureResult = currentReader.CaptureAsync(Constants.Formats.Fid.ANSI, Constants.CaptureProcessing.DP_IMG_PROC_DEFAULT, currentReader.Capabilities.Resolutions[0]);
if (captureResult != Constants.ResultCode.DP_SUCCESS)
{
SetStatus("" + captureResult);
}
return true;
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message);
return false;
}
}
#endregion
#region OnCaptured
public void OnCaptured(CaptureResult captureResult)
{
try
{
// Check capture quality and throw an error if bad.
if (!CheckCaptureResult(captureResult)) return;
SetStatus("Verifying...");
// Create bitmap
foreach (Fid.Fiv fiv in captureResult.Data.Views)
{
var fmd = FeatureExtraction.CreateFmdFromRaw(fiv.RawImage, 1, 0, fiv.Width, fiv.Height, currentReader.Capabilities.Resolutions[0], Constants.Formats.Fmd.DP_VERIFICATION);
PostFingerprint(Convert.ToBase64String(fmd.Data.Bytes));
}
}
catch {}
}
#endregion
#region CheckCaptureResult
///
/// Check quality of the resulting capture.
///
public bool CheckCaptureResult(CaptureResult captureResult)
{
if (captureResult.Data == null || captureResult.ResultCode != Constants.ResultCode.DP_SUCCESS)
{
if (captureResult.ResultCode != Constants.ResultCode.DP_SUCCESS)
{
throw new Exception(captureResult.ResultCode.ToString());
}
// Send message if quality shows fake finger
if ((captureResult.Quality != Constants.CaptureQuality.DP_QUALITY_CANCELED))
{
throw new Exception("Quality - " + captureResult.Quality);
}
return false;
}
return true;
}
#endregion
#region SetStatus
protected void SetStatus(string status)
{
if (InvokeRequired)
{
this.Invoke(new MethodInvoker(delegate
{
StatusLine.Text = status;
}));
}
else
{
StatusLine.Text = status;
}
}
#endregion
#region SetPrompt
protected void SetPrompt(string prompt)
{
if (InvokeRequired)
{
this.Invoke(new MethodInvoker(delegate
{
Prompt.Text = prompt;
}));
}
else
{
Prompt.Text = prompt;
}
}
#endregion
}
}