C# WPF调用身份证读卡器,求大神指点
问题描述:
我正在开发一个管理系统,需要集成身份证读卡器功能。
硬件信息:
- 身份证读卡器型号:[中控智慧ID100]
- 连接方式:USB
代码环境:
- Visual Studio 2022
- .NET Framework 4.8
- WPF项目
C# WPF调用身份证读卡器,求大神指点
问题描述:
我正在开发一个管理系统,需要集成身份证读卡器功能。
硬件信息:
代码环境:
关注让【宝码香车】来帮您解答,本回答参考DeepSeek编写,并整理提供。
如果答案能帮助您,请采纳,非常感谢!
.
每日一句正能量,让它带给您好心情:别让过去的阴影,遮挡你未来的阳光。
.
针对您使用中控智慧ID100身份证读卡器在WPF项目中的集成需求,我为您提供完整的解决方案:
首先需要从中控智慧官网下载对应型号的SDK开发包,通常包含:
将SDK中的DLL文件(如ZK_IDR.dll)添加到项目引用中:
// 在代码中声明DLL导入
[DllImport("ZK_IDR.dll")]
public static extern int IDR_InitComm(int port);
[DllImport("ZK_IDR.dll")]
public static extern int IDR_Authenticate();
[DllImport("ZK_IDR.dll")]
public static extern int IDR_Read_Content(int active);
using System;
using System.Runtime.InteropServices;
using System.Text;
public class IDCardReaderService
{
// DLL导入声明
[DllImport("ZK_IDR.dll")]
private static extern int IDR_InitComm(int port);
[DllImport("ZK_IDR.dll")]
private static extern int IDR_Authenticate();
[DllImport("ZK_IDR.dll")]
private static extern int IDR_Read_Content(int active);
[DllImport("ZK_IDR.dll")]
private static extern int IDR_GetPeopleName(byte[] data, int len);
[DllImport("ZK_IDR.dll")]
private static extern int IDR_GetPeopleSex(byte[] data, int len);
[DllImport("ZK_IDR.dll")]
private static extern int IDR_GetPeopleNation(byte[] data, int len);
[DllImport("ZK_IDR.dll")]
private static extern int IDR_GetPeopleBirthday(byte[] data, int len);
[DllImport("ZK_IDR.dll")]
private static extern int IDR_GetPeopleAddress(byte[] data, int len);
[DllImport("ZK_IDR.dll")]
private static extern int IDR_GetPeopleIDCode(byte[] data, int len);
[DllImport("ZK_IDR.dll")]
private static extern int IDR_CloseComm();
/// <summary>
/// 初始化读卡器
/// </summary>
public bool InitializeReader()
{
try
{
// 通常USB设备端口号为1001
int result = IDR_InitComm(1001);
return result == 1;
}
catch (Exception ex)
{
Console.WriteLine($"初始化读卡器失败: {ex.Message}");
return false;
}
}
/// <summary>
/// 读取身份证信息
/// </summary>
public IDCardInfo ReadIDCard()
{
try
{
// 认证卡片
if (IDR_Authenticate() != 1)
{
throw new Exception("卡片认证失败");
}
// 读取内容
if (IDR_Read_Content(1) != 1)
{
throw new Exception("读取卡片内容失败");
}
// 获取各项信息
var info = new IDCardInfo
{
Name = GetStringData(IDR_GetPeopleName, 30),
Gender = GetStringData(IDR_GetPeopleSex, 2),
Nation = GetStringData(IDR_GetPeopleNation, 4),
Birthday = GetStringData(IDR_GetPeopleBirthday, 16),
Address = GetStringData(IDR_GetPeopleAddress, 70),
IDNumber = GetStringData(IDR_GetPeopleIDCode, 36)
};
return info;
}
catch (Exception ex)
{
throw new Exception($"读取身份证信息失败: {ex.Message}");
}
}
private string GetStringData(Func<byte[], int, int> getDataFunc, int bufferSize)
{
byte[] buffer = new byte[bufferSize];
int result = getDataFunc(buffer, bufferSize);
if (result == 1)
{
return Encoding.GetEncoding("GB2312").GetString(buffer).TrimEnd('\0');
}
return string.Empty;
}
/// <summary>
/// 关闭读卡器连接
/// </summary>
public void CloseReader()
{
IDR_CloseComm();
}
}
public class IDCardInfo
{
public string Name { get; set; }
public string Gender { get; set; }
public string Nation { get; set; }
public string Birthday { get; set; }
public string Address { get; set; }
public string IDNumber { get; set; }
public override string ToString()
{
return $"姓名: {Name}\n性别: {Gender}\n民族: {Nation}\n出生: {Birthday}\n住址: {Address}\n身份证号: {IDNumber}";
}
}
<Window x:Class="IDCardReaderDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="身份证读卡器" Height="450" Width="600">
<Grid Margin="20">
<StackPanel>
<Button x:Name="btnInitialize" Content="初始化读卡器" Click="BtnInitialize_Click" Height="30" Margin="0,0,0,10"/>
<Button x:Name="btnReadCard" Content="读取身份证" Click="BtnReadCard_Click" Height="30" Margin="0,0,0,10" IsEnabled="False"/>
<Button x:Name="btnClose" Content="关闭读卡器" Click="BtnClose_Click" Height="30" Margin="0,0,0,20"/>
<GroupBox Header="身份证信息">
<TextBox x:Name="txtInfo" Height="200" VerticalScrollBarVisibility="Auto"
IsReadOnly="True" TextWrapping="Wrap" Margin="10"/>
</GroupBox>
<TextBlock x:Name="txtStatus" Margin="0,10,0,0" Foreground="Gray"/>
</StackPanel>
</Grid>
</Window>
using System.Windows;
namespace IDCardReaderDemo
{
public partial class MainWindow : Window
{
private IDCardReaderService _readerService;
public MainWindow()
{
InitializeComponent();
_readerService = new IDCardReaderService();
}
private void BtnInitialize_Click(object sender, RoutedEventArgs e)
{
try
{
if (_readerService.InitializeReader())
{
txtStatus.Text = "读卡器初始化成功";
btnReadCard.IsEnabled = true;
}
else
{
txtStatus.Text = "读卡器初始化失败,请检查设备连接";
}
}
catch (Exception ex)
{
MessageBox.Show($"初始化失败: {ex.Message}");
}
}
private void BtnReadCard_Click(object sender, RoutedEventArgs e)
{
try
{
var idCardInfo = _readerService.ReadIDCard();
txtInfo.Text = idCardInfo.ToString();
txtStatus.Text = "身份证读取成功";
}
catch (Exception ex)
{
MessageBox.Show($"读取失败: {ex.Message}");
txtStatus.Text = "读取失败,请重新放置身份证";
}
}
private void BtnClose_Click(object sender, RoutedEventArgs e)
{
_readerService.CloseReader();
btnReadCard.IsEnabled = false;
txtStatus.Text = "读卡器已关闭";
}
protected override void OnClosed(EventArgs e)
{
_readerService.CloseReader();
base.OnClosed(e);
}
}
}
try-catch捕获异常这个方案应该能帮助您成功集成身份证读卡器功能。如果遇到具体的技术问题,请提供更详细的错误信息,我可以进一步协助解决。