|
มันเป็นศาสตร์อันดำมืดมาอย่างยาวนาน เพราะแอดมินค้นหาข้อมูลหรือโค้ด VB.NET ในการติดต่อกับเครื่องอ่านบัตรประชาชน หรือ Smart Card Reader ไม่เจอเลย แอดมินเลยตัดสินใจลองสั่งซื้อเครื่องอ่านบัตรสมาร์ทการ์ดในราคา 550 บาทมาลองเล่นดู (ทั้งๆที่ไม่มีโครงการใดๆกับเครื่องอ่านบัตรเลย แฮ่ๆๆๆ+) โดยใช้ Library ของคุณ Chakphanu Komasathit (ดาวน์โหลดไฟล์ต้นฉบับ C# จาก GitHub ได้ที่นี่) ... แอดมินแปลงโค้ด C# ที่อยู่ในไฟล์ชุดตัวอย่างของผู้พัฒนาให้เป็น VB แทนครับ และเพิ่มเติมเทคนิคในการอ่านบัตรประชาชนให้ไปทำงานอยู่เบื้องหลังแทน ด้วยการใช้ BackGroundWorker นั่นหมายความว่าเราจะสามารถขยับฟอร์มไปมาได้ โดยไม่มีการหน้าจอค้างครับผม ...
แอดมินแนะนำให้ลองหายี่ห้อ WAC กะ Zoweetek ราคาสัก 2 ร้อยกว่าๆมาใช้งานดูก็น่าจะทำงานได้เหมือนกันครับ หาซื้อได้ทั้งที่ Shopee หรือ Lazada สำหรับรุ่นที่แอดมินใช้ สั่งซื้อจากที่นี่ครับ ...
DOWNLOAD FULL SOURCE CODE (VB.NET-2010)
ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) โดยการใช้ .Net Framework 4.0 ได้ที่นี่ ...
การติดตั้ง Library หรือไฟล์ DLL ผ่านทาง Tools --> NuGet Package Manager --> Manage NuGet Packages for Solution ...
หรือเลือกการเบราซ์หาไฟล์ด้วยการ Add References ...
มาดูโค้ดฉบับเต็มกันเถอะ ...
- ' / Special Thanks.
- ' / https://github.com/chakphanu/ThaiNationalIDCard
- Imports ThaiNationalIDCard
- Imports System.ComponentModel
- Public Class frmSmartCard
- Dim bgWorker As New BackgroundWorker
- Private Sub frmSmartCard_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
- Select Case e.KeyCode
- Case Keys.F7
- Call btnRead_Click(sender, e)
- Case Keys.F10
- Me.Close()
- End Select
- End Sub
- Private Sub frmSmartCard_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
- Call SetupScreen()
- '// Detect Smart card reader.
- If Not GetReader() Then Return
- ProgressBar1.Visible = False
- '// Initialized BackGroundWorker
- With bgWorker
- .WorkerReportsProgress = True
- .WorkerSupportsCancellation = True
- End With
- '// *********** IMPORTANT ***********
- Control.CheckForIllegalCrossThreadCalls = False
- '// Add Event Handler.
- AddHandler bgWorker.DoWork, AddressOf bgWorker_DoWork
- AddHandler bgWorker.RunWorkerCompleted, AddressOf bgWorker_RunWorkerCompleted
- End Sub
- '// ตรวจสอบเครื่องอ่านบัตรว่ามีอยู่หรือไม่
- Function GetReader() As Boolean
- Try
- Dim ID As New ThaiIDCard
- Dim readers = ID.GetReaders
- If readers Is Nothing Then
- Return False
- Else
- Return True
- End If
- Catch ex As Exception
- MessageBox.Show("Smart Card Reader not found.", "Report Status", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
- Return False
- End Try
- End Function
- Private Sub btnRead_Click(sender As System.Object, e As System.EventArgs) Handles btnRead.Click
- Call SetupScreen()
- If Not GetReader() Then Return
- btnRead.Enabled = False
- '/
- ProgressBar1.Style = ProgressBarStyle.Marquee
- ProgressBar1.Visible = True
- '// BackGroundWorker
- bgWorker.RunWorkerAsync()
- End Sub
- Private Sub bgWorker_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs)
- Try
- '// -------------------------------------------
- '// โค้ดส่วนของการอ่านข้อมูลบัตรประชาชน
- Dim ID As New ThaiIDCard
- Refresh()
- Dim Personal As Personal = ID.readAllPhoto
- If Not IsNothing(Personal) Then
- With Personal
- txtIDCard.Text = .Citizenid
- txtPrefixThai.Text = .Th_Prefix
- txtPrefixEng.Text = .En_Prefix
- txtFirstNameThai.Text = .Th_Firstname
- txtLastnameThai.Text = .Th_Lastname
- txtFirstNameEng.Text = .En_Firstname
- txtLastnameEng.Text = .En_Lastname
- txtBirthDate.Text = Format(CDate(.Birthday.ToString), "dd/MM/yyyy")
- '// คำนวณอายุ
- If Not IsNothing(txtBirthDate.Text) Then lblAge.Text = CalcDate(txtBirthDate.Text, Now())
- '// 1 = ชาย, 2 = หญิง (นำไปแปลงค่าเพศในฟังค์ชั่นก่อน)
- txtSex.Text = CheckSex(.Sex, txtSex).ToString
- txtIssueDate.Text = Format(CDate(.Issue.ToString), "dd/MM/yyyy")
- txtExpireDate.Text = Format(CDate(.Expire.ToString), "dd/MM/yyyy")
- '// ที่อยู่
- txtHouseNo.Text = .addrHouseNo
- txtVillageNo.Text = .addrVillageNo
- txtLane.Text = .addrLane
- txtRoad.Text = .addrRoad
- txtTambol.Text = .addrTambol
- txtAmphur.Text = .addrAmphur
- txtProvince.Text = .addrProvince
- '// รูปภาพ
- picData.Image = .PhotoBitmap
- End With
- '// -------------------------------------------
- '//
- ElseIf (ID.ErrorCode() > 0) Then
- MessageBox.Show(ID.Error)
- Else
- MessageBox.Show("Catch All", "รายงานความผิดพลาด", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
- End If
- Catch ex As Exception
- MessageBox.Show(ex.Message)
- End Try
- btnRead.Enabled = True
- End Sub
- '// Reading complete.
- Private Sub bgWorker_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs)
- ProgressBar1.Visible = False
- 'MessageBox.Show("Done Complete.", "Report Status", MessageBoxButtons.OK, MessageBoxIcon.Information)
- End Sub
- Function CheckSex(ByVal sex As Byte, ByRef txt As TextBox) As String
- '// เก็บค่าตัวเลขไว้ใน Tag เผื่อไว้ตอนไปเก็บลงในฐานข้อมูล [กำหนดให้ ชาย=1 หญิง=2]
- txt.Tag = sex
- If sex = 1 Then
- CheckSex = "ชาย"
- Else
- CheckSex = "หญิง"
- End If
- End Function
- '// เคลียร์หน้าจอทั้งหมด
- Sub SetupScreen()
- '// หรือสั่งลูปเคลียร์ TextBox Control ทั้งหมดที่มีอยู่บนฟอร์ม
- For Each tb As TextBox In Me.GroupBox1.Controls.OfType(Of TextBox)()
- tb.Clear()
- Next
- picData.Image = Nothing
- End Sub
- Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
- Me.Close()
- End Sub
- Private Sub frmSmartCard_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
- Me.Dispose()
- GC.SuppressFinalize(Me)
- Application.Exit()
- End Sub
- ' / --------------------------------------------------------------------------------
- ' / ฟังค์ชั่นในการคำนวณหาความแตกต่างระหว่างวันเดือนปี (คำนวณหาอายุ)
- ' / คัดลอกโค้ดทั้งหมดมาจาก VB6
- Public Function CalcDate(sDate As Date, eDate As Date) As String
- Dim vDays As Integer
- Dim vMonths As Integer
- Dim vYears As Integer
- '/ Parameters:
- '/ sDate - ค่าวันเดือนปีเกิด (หรือวันเดือนปีที่ต้องการคำนวณหา)
- '/ eDate - คำนวณเทียบกับวันเดือนปีปัจจุบัน (Now())
- '/ Results:
- '/ vYears - เก็บค่าความแตกต่างของจำนวนปี
- '/ vMonths - เก็บค่าความแตกต่างของจำนวนเดือน
- '/ vDays - เก็บค่าความแตกต่างของจำนวนวัน
- '/ หาความแตกต่างของจำนวนเดือน
- vMonths = DateDiff("m", sDate, eDate)
- vDays = DateDiff("d", DateAdd("m", vMonths, sDate), eDate)
- If vDays < 0 Then
- vMonths = vMonths - 1
- vDays = DateDiff("d", DateAdd("m", vMonths, sDate), eDate)
- End If
- vYears = vMonths \ 12 ' หารตัดเศษก็จะได้จำนวนปี
- vMonths = vMonths Mod 12 ' การหารเอาเศษ โดยจะมีค่าระหว่าง 0, 1, 2, ... 11 ไม่มีทางเท่ากับ หรือ มากกว่า 12
- CalcDate = "อายุ: " & vYears & " ปี " & vMonths & " เดือน " & vDays & " วัน."
- End Function
- End Class
คัดลอกไปที่คลิปบอร์ด
|
|