描述:-
上软件运行界面:
温馨提示:运行程序别忘了装驱动哦!
上完整源码。界面可以自己画!
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; using System.Runtime.InteropServices; using System.IO; namespace PeopleCardInfoRed { public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { //lblName.Text = DateTime.Now.Ticks.ToString(); InitControl(); InitThread(); ReadCard(); } int ReadFalseCount = 0; /// <summary> /// 读卡方法 /// </summary> void ReadCard() { if (IsScanning) { return; } Thread ThreadReadCard = new Thread(new ThreadStart(delegate { IsScanning = true; while (IsScanning) { Thread.Sleep(500); int iPort = Project.DevicePort; if (Project.IsOpenedPort) { IsReading = true; IntPtr tmp = Marshal.AllocCoTaskMem(4); int FindIDCard = API.SDT_StartFindIDCard(iPort, tmp, 0); if (FindIDCard == 0x9f) { IntPtr tmp1 = Marshal.AllocCoTaskMem(8); int SelectIDCard = API.SDT_SelectIDCard(iPort, tmp1, 0); } IntPtr ptr_txt = Marshal.AllocCoTaskMem(256); IntPtr ptr_txtlen = Marshal.AllocCoTaskMem(4); IntPtr ptr_pic = Marshal.AllocCoTaskMem(1024); IntPtr ptr_piclen = Marshal.AllocCoTaskMem(4); if (API.SDT_ReadBaseMsg(iPort, ptr_txt, ptr_txtlen, ptr_pic, ptr_piclen, 0) == 0x90) { ReadFalseCount = 0; int txtLen = Marshal.ReadInt32(ptr_txtlen); byte[] txt = new byte[txtLen]; for (int i = 0; i < txtLen; i++) { txt[i] = Marshal.ReadByte(ptr_txt, i); } //文本解析 string Name = string.Empty; string Sex = string.Empty; string Mz = string.Empty; string Birthday = string.Empty; string Address = string.Empty; string IDNum = string.Empty; string Fzjg = string.Empty; string Yxq = string.Empty; string AppendMsg = string.Empty; string NewAddress = string.Empty; { Name = System.Text.Encoding.Unicode.GetString(txt, 0x00, 30).Trim();//姓名 Sex = System.Text.Encoding.Unicode.GetString(txt, 0x1E, 2).Trim();//性别 IDNum = System.Text.Encoding.Unicode.GetString(txt, 0x7A, 36).Trim();//身份证号 IntPtr ptr_newappendmsg = Marshal.AllocCoTaskMem(70); IntPtr ptr_newappendmsglen = Marshal.AllocCoTaskMem(4); if (API.SDT_ReadNewAppMsg(iPort, ptr_newappendmsg, ptr_newappendmsglen, 0) == 0x90) { int NewAppendMsgLen = Marshal.ReadInt32(ptr_newappendmsglen); byte[] NewAppendMsg = new byte[NewAppendMsgLen]; for (int i = 0; i < NewAppendMsgLen; i++) { NewAppendMsg[i] = Marshal.ReadByte(ptr_newappendmsg, i); } NewAddress = System.Text.Encoding.Unicode.GetString(NewAppendMsg); } if (FindIDCard != 0x9f) { if (!lblIDCardNum.Text.Equals(string.Empty)) { Thread.Sleep(500); continue; } } } Image img = null; //照片解析 { int picLen = Marshal.ReadInt32(ptr_piclen); byte[] pic = new byte[picLen]; for (int i = 0; i < picLen; i++) { pic[i] = Marshal.ReadByte(ptr_pic, i); } string zpPath = Application.StartupPath + "\\" + IDNum; FileStream fs = new FileStream(zpPath + ".wlt", FileMode.Create); fs.Write(pic, 0, pic.Length); fs.Close(); int zpResult = API.GetBmp(zpPath + ".wlt", 1); if (zpResult == 1) { FileStream zpfs = new FileStream(zpPath + ".bmp", FileMode.Open); byte[] zp = new byte[zpfs.Length]; zpfs.Read(zp, 0, (int)zpfs.Length); zpfs.Close(); File.Delete(zpPath + ".bmp"); MemoryStream ms = new MemoryStream(zp); ms.Write(zp, 0, zp.Length); img = Image.FromStream(ms); } } SetCardInfo( Name, Convert.ToInt32(Sex) == 1 ? "男" : "女", IDNum, img ); } else { SetInfo("未读到卡"); ReadFalseCount++; if (ReadFalseCount >= 10) { ReadFalseCount = 0; API.SDT_ResetSAM(iPort, 0); API.SDT_ClosePort(iPort); Project.IsOpenedPort = false; IsReading = false; Thread.Sleep(500); } } IsReading = false; } else { SetInfo("未打开端口"); //IsScanning = false; Thread.Sleep(500); continue; } } IsScanning = false; // Thread.Sleep(500); })); ThreadReadCard.IsBackground = true; ThreadReadCard.Name = "循环读卡进程"; ThreadReadCard.Start(); } void SetInfo( string sInfo ) { richTextBox1.Invoke(new EventHandler(delegate { richTextBox1.AppendText(sInfo); })); } void SetCardInfo( string Name, string Sex, string IDCardNumber, Image zp) { lblName.Invoke(new EventHandler(delegate { lblName.Text = Name; })); lblIDCardNum.Invoke(new EventHandler(delegate { lblIDCardNum.Text = IDCardNumber; })); picPhoto.Invoke(new EventHandler(delegate { picPhoto.Image = zp; })); } void InitThread() { CheckPort(); } bool IsReading = false; bool IsScanning = false; void CheckPort() { Thread CheckPortThread = new Thread(new ThreadStart(delegate { while (true) { if (IsReading) { Thread.Sleep(500); continue; } int OpenResult = 0x01; int i = 0; if (!Project.IsOpenedPort) { for (i = 1001; i <= 1016; i++) { try { API.SDT_ClosePort(i); } catch { } try { OpenResult = API.SDT_OpenPort(i); } catch { } if (OpenResult == 0x90) { if (i != Project.DevicePort) { Project.DevicePort = i; } break; } } } else { OpenResult = API.SDT_OpenPort(Project.DevicePort); } Console.WriteLine(Project.DevicePort); string tmpText = string.Empty; if (OpenResult == 0x90) { Project.IsOpenedPort = true; tmpText = "USB端口 " + Project.DevicePort.ToString(); } else { Project.IsOpenedPort = false; tmpText = "端口打开失败..."; } lblPortState.Invoke(new EventHandler(delegate { lblPortState.Text = tmpText; })); if (Project.IsOpenedPort) { Thread.Sleep(300); } else { Thread.Sleep(500); } Console.WriteLine("Port Scanning"); } })); CheckPortThread.IsBackground = true; CheckPortThread.Name = "端口循环检测线程"; CheckPortThread.Start(); } /// <summary> /// 初始化控件 /// </summary> void InitControl() { #region 初始化变量 //Setting.Read(); #endregion } private void button1_Click(object sender, EventArgs e) { picPhoto.Image = null; lblIDCardNum.Text = ""; lblName.Text = ""; lblSex.Text = ""; } } }
个人签名:己所不欲勿施于人
上一篇:暂无
下一篇:c#如何集成控制Led屏,实现数据发送自动开机、关机等操作!