开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 4741|回复: 1
收起左侧

[C#源码] winform 身、份、证信息读取程序源码

[复制链接]
发表于 2019-7-10 08:35:56 | 显示全部楼层 |阅读模式   湖北省武汉市
20190513172827730.png
温馨提示:运行程序别忘了装驱动哦!



上完整源码。界面可以自己画!

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Threading;
  10. using System.Runtime.InteropServices;
  11. using System.IO;

  12. namespace PeopleCardInfoRed
  13. {
  14.     public partial class Form2 : Form
  15.     {
  16.         public Form2()
  17.         {
  18.             InitializeComponent();
  19.         }

  20.         private void Form2_Load(object sender, EventArgs e)
  21.         {
  22.             //lblName.Text = DateTime.Now.Ticks.ToString();
  23.             InitControl();
  24.             InitThread();
  25.             ReadCard();
  26.         }

  27.         int ReadFalseCount = 0;

  28.         /// <summary>
  29.         /// 读卡方法
  30.         /// </summary>
  31.         void ReadCard()
  32.         {
  33.             if (IsScanning)
  34.             {
  35.                 return;
  36.             }
  37.             Thread ThreadReadCard = new Thread(new ThreadStart(delegate
  38.             {
  39.                 IsScanning = true;
  40.                 while (IsScanning)
  41.                 {
  42.                     Thread.Sleep(500);
  43.                     int iPort = Project.DevicePort;
  44.                     if (Project.IsOpenedPort)
  45.                     {
  46.                         IsReading = true;
  47.                         IntPtr tmp = Marshal.AllocCoTaskMem(4);
  48.                         int FindIDCard = API.SDT_StartFindIDCard(iPort, tmp, 0);
  49.                         if (FindIDCard == 0x9f)
  50.                         {
  51.                             IntPtr tmp1 = Marshal.AllocCoTaskMem(8);
  52.                             int SelectIDCard = API.SDT_SelectIDCard(iPort, tmp1, 0);
  53.                         }
  54.                         IntPtr ptr_txt = Marshal.AllocCoTaskMem(256);
  55.                         IntPtr ptr_txtlen = Marshal.AllocCoTaskMem(4);
  56.                         IntPtr ptr_pic = Marshal.AllocCoTaskMem(1024);
  57.                         IntPtr ptr_piclen = Marshal.AllocCoTaskMem(4);
  58.                         if (API.SDT_ReadBaseMsg(iPort, ptr_txt, ptr_txtlen, ptr_pic, ptr_piclen, 0) == 0x90)
  59.                         {
  60.                             ReadFalseCount = 0;
  61.                             int txtLen = Marshal.ReadInt32(ptr_txtlen);
  62.                             byte[] txt = new byte[txtLen];
  63.                             for (int i = 0; i < txtLen; i++)
  64.                             {
  65.                                 txt[i] = Marshal.ReadByte(ptr_txt, i);
  66.                             }
  67.                             //文本解析
  68.                             string Name = string.Empty;
  69.                             string Sex = string.Empty;
  70.                             string Mz = string.Empty;
  71.                             string Birthday = string.Empty;
  72.                             string Address = string.Empty;
  73.                             string IDNum = string.Empty;
  74.                             string Fzjg = string.Empty;
  75.                             string Yxq = string.Empty;
  76.                             string AppendMsg = string.Empty;
  77.                             string NewAddress = string.Empty;
  78.                             {
  79.                                 Name = System.Text.Encoding.Unicode.GetString(txt, 0x00, 30).Trim();//姓名
  80.                                 Sex = System.Text.Encoding.Unicode.GetString(txt, 0x1E, 2).Trim();//性别
  81.                                 IDNum = System.Text.Encoding.Unicode.GetString(txt, 0x7A, 36).Trim();//身份证号
  82.                                 IntPtr ptr_newappendmsg = Marshal.AllocCoTaskMem(70);
  83.                                 IntPtr ptr_newappendmsglen = Marshal.AllocCoTaskMem(4);
  84.                                 if (API.SDT_ReadNewAppMsg(iPort, ptr_newappendmsg, ptr_newappendmsglen, 0) == 0x90)
  85.                                 {
  86.                                     int NewAppendMsgLen = Marshal.ReadInt32(ptr_newappendmsglen);
  87.                                     byte[] NewAppendMsg = new byte[NewAppendMsgLen];
  88.                                     for (int i = 0; i < NewAppendMsgLen; i++)
  89.                                     {
  90.                                         NewAppendMsg[i] = Marshal.ReadByte(ptr_newappendmsg, i);
  91.                                     }
  92.                                     NewAddress = System.Text.Encoding.Unicode.GetString(NewAppendMsg);
  93.                                 }
  94.                                 if (FindIDCard != 0x9f)
  95.                                 {
  96.                                     if (!lblIDCardNum.Text.Equals(string.Empty))
  97.                                     {
  98.                                         Thread.Sleep(500);
  99.                                         continue;
  100.                                     }
  101.                                 }
  102.                             }
  103.                             Image img = null;
  104.                             //照片解析
  105.                             {
  106.                                 int picLen = Marshal.ReadInt32(ptr_piclen);
  107.                                 byte[] pic = new byte[picLen];
  108.                                 for (int i = 0; i < picLen; i++)
  109.                                 {
  110.                                     pic[i] = Marshal.ReadByte(ptr_pic, i);
  111.                                 }
  112.                                 string zpPath = Application.StartupPath + "\" + IDNum;
  113.                                 FileStream fs = new FileStream(zpPath + ".wlt", FileMode.Create);
  114.                                 fs.Write(pic, 0, pic.Length);
  115.                                 fs.Close();
  116.                                 int zpResult = API.GetBmp(zpPath + ".wlt", 1);
  117.                                 if (zpResult == 1)
  118.                                 {
  119.                                     FileStream zpfs = new FileStream(zpPath + ".bmp", FileMode.Open);
  120.                                     byte[] zp = new byte[zpfs.Length];
  121.                                     zpfs.Read(zp, 0, (int)zpfs.Length);
  122.                                     zpfs.Close();
  123.                                     File.Delete(zpPath + ".bmp");
  124.                                     MemoryStream ms = new MemoryStream(zp);
  125.                                     ms.Write(zp, 0, zp.Length);
  126.                                     img = Image.FromStream(ms);
  127.                                 }
  128.                             }
  129.                             SetCardInfo(
  130.                                 Name,
  131.                                 Convert.ToInt32(Sex) == 1 ? "男" : "女",
  132.                                 IDNum,
  133.                                 img
  134.                             );
  135.                         }
  136.                         else
  137.                         {
  138.                             SetInfo("未读到卡");
  139.                             ReadFalseCount++;
  140.                             if (ReadFalseCount >= 10)
  141.                             {
  142.                                 ReadFalseCount = 0;
  143.                                 API.SDT_ResetSAM(iPort, 0);
  144.                                 API.SDT_ClosePort(iPort);
  145.                                 Project.IsOpenedPort = false;
  146.                                 IsReading = false;
  147.                                 Thread.Sleep(500);
  148.                             }
  149.                         }
  150.                         IsReading = false;
  151.                     }
  152.                     else
  153.                     {
  154.                         SetInfo("未打开端口");
  155.                         //IsScanning = false;
  156.                         Thread.Sleep(500);
  157.                         continue;
  158.                     }
  159.                 }
  160.                 IsScanning = false;
  161.                 // Thread.Sleep(500);
  162.             }));
  163.             ThreadReadCard.IsBackground = true;
  164.             ThreadReadCard.Name = "循环读卡进程";
  165.             ThreadReadCard.Start();
  166.         }

  167.         void SetInfo(
  168.     string sInfo
  169.        )
  170.         {
  171.             richTextBox1.Invoke(new EventHandler(delegate
  172.             {
  173.                 richTextBox1.AppendText(sInfo);
  174.             }));
  175.         }

  176.         void SetCardInfo(
  177.             string Name,
  178.             string Sex,
  179.             string IDCardNumber,
  180.             Image zp)
  181.         {
  182.             lblName.Invoke(new EventHandler(delegate
  183.             {
  184.                 lblName.Text = Name;
  185.             }));
  186.             lblIDCardNum.Invoke(new EventHandler(delegate
  187.             {
  188.                 lblIDCardNum.Text = IDCardNumber;
  189.             }));
  190.             picPhoto.Invoke(new EventHandler(delegate
  191.             {
  192.                 picPhoto.Image = zp;
  193.             }));
  194.         }

  195.         void InitThread()
  196.         {
  197.             CheckPort();
  198.         }

  199.         bool IsReading = false;
  200.         bool IsScanning = false;
  201.         void CheckPort()
  202.         {
  203.             Thread CheckPortThread = new Thread(new ThreadStart(delegate
  204.             {
  205.                 while (true)
  206.                 {
  207.                     if (IsReading)
  208.                     {
  209.                         Thread.Sleep(500);
  210.                         continue;
  211.                     }
  212.                     int OpenResult = 0x01;
  213.                     int i = 0;
  214.                     if (!Project.IsOpenedPort)
  215.                     {
  216.                         for (i = 1001; i <= 1016; i++)
  217.                         {
  218.                             try
  219.                             {
  220.                                 API.SDT_ClosePort(i);
  221.                             }
  222.                             catch { }
  223.                             try { OpenResult = API.SDT_OpenPort(i); }
  224.                             catch { }
  225.                             if (OpenResult == 0x90)
  226.                             {
  227.                                 if (i != Project.DevicePort)
  228.                                 {
  229.                                     Project.DevicePort = i;
  230.                                 }
  231.                                 break;
  232.                             }
  233.                         }
  234.                     }
  235.                     else
  236.                     {
  237.                         OpenResult = API.SDT_OpenPort(Project.DevicePort);
  238.                     }
  239.                     Console.WriteLine(Project.DevicePort);
  240.                     string tmpText = string.Empty;
  241.                     if (OpenResult == 0x90)
  242.                     {
  243.                         Project.IsOpenedPort = true;
  244.                         tmpText = "USB端口 " + Project.DevicePort.ToString();
  245.                     }
  246.                     else
  247.                     {
  248.                         Project.IsOpenedPort = false;
  249.                         tmpText = "端口打开失败...";
  250.                     }
  251.                     lblPortState.Invoke(new EventHandler(delegate
  252.                     {
  253.                         lblPortState.Text = tmpText;
  254.                     }));
  255.                     if (Project.IsOpenedPort)
  256.                     {
  257.                         Thread.Sleep(300);
  258.                     }
  259.                     else
  260.                     {
  261.                         Thread.Sleep(500);
  262.                     }
  263.                     Console.WriteLine("Port Scanning");
  264.                 }
  265.             }));
  266.             CheckPortThread.IsBackground = true;
  267.             CheckPortThread.Name = "端口循环检测线程";
  268.             CheckPortThread.Start();
  269.         }

  270.         /// <summary>
  271.         /// 初始化控件
  272.         /// </summary>
  273.         void InitControl()
  274.         {
  275.             #region 初始化变量
  276.             //Setting.Read();
  277.             #endregion
  278.         }

  279.         private void button1_Click(object sender, EventArgs e)
  280.         {
  281.             picPhoto.Image = null;
  282.             lblIDCardNum.Text = "";
  283.             lblName.Text = "";
  284.             lblSex.Text = "";
  285.         }
  286.     }
  287. }
复制代码



结帖率:100% (2/2)

签到天数: 26 天

发表于 2019-7-23 07:40:50 | 显示全部楼层   上海市上海市
瞬间感觉C好强大
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表