這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
最近的項目需要用到手寫電子簽名的功能,挑來挑去最後選擇了蒙恬Write2Go這款手寫板裝置,因為手寫板上面直接就有一塊電子油墨顯示屏,所寫即所得,還可以看到寫的筆跡
安裝完蒙恬的驅動及內建應用程式之後,經過測試發現,其工作原理是利用了windows剪下板作為中間橋樑來交換圖片資料,每次簽名的時候首先需要啟動蒙恬內建的一個叫做"蒙恬即寫通"的程式:
畢竟手寫的筆跡傳到電腦上的時候走的還是手寫板的電阻屏,所以筆跡效果肯定不如電子油墨屏上面顯示的好看,按下裝置上的發送按鈕,筆跡會作為圖片的形式儲存到windows剪下板中,利用上一篇寫到的windows剪下板內容監視方法,可以在自己的程式中調用到手寫筆跡圖片,具體實現起來涉及到下面幾個技術點:
- 在程式中點擊簽名地區時調用蒙恬的"即寫通"程式
- 監視windows剪下板,發現有圖片資料更新到剪下板中時將其調用到自己的程式中的pictureBox控制項裡顯示出來
- 把pictureBox控制項中顯示的簽名筆跡image類型資料寫入資料庫中
- 從資料庫中讀取image類型資料並在winform的pictureBox控制項裡顯示出來
完整的代碼如下:
Imports System.IOImports System.Data.SqlClientPublic Class clipboardMon '------------------監視剪下板資料代碼開始------------------#Region " Definitions " 'Constants for API Calls... Private Const WM_DRAWCLIPBOARD As Integer = &H308 Private Const WM_CHANGECBCHAIN As Integer = &H30D 'Handle for next clipboard viewer... Private mNextClipBoardViewerHWnd As IntPtr 'API declarations... Declare Auto Function SetClipboardViewer Lib "user32" (ByVal HWnd As IntPtr) As IntPtr Declare Auto Function ChangeClipboardChain Lib "user32" (ByVal HWnd As IntPtr, ByVal HWndNext As IntPtr) As Boolean Declare Auto Function SendMessage Lib "User32" (ByVal HWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Long#End Region#Region " Contructor " Public Sub NewViewer() 'InitializeComponent() 'To register this form as a clipboard viewer... Clipboard.Clear() mNextClipBoardViewerHWnd = SetClipboardViewer(Me.Handle) End Sub#End Region#Region " Message Process " 'Override WndProc to get messages... Protected Overrides Sub WndProc(ByRef m As Message) Select Case m.Msg Case Is = WM_DRAWCLIPBOARD 'The clipboard has changed... '########################################################################## ' Process Clipboard Here :)........................ '########################################################################## SendMessage(mNextClipBoardViewerHWnd, m.Msg, m.WParam, m.LParam) '顯示剪貼簿中的圖片資訊 If Clipboard.ContainsImage() = True Then PictureBox1.Image = Clipboard.GetImage() PictureBox1.Update() End If Case Is = WM_CHANGECBCHAIN 'Another clipboard viewer has removed itself... If m.WParam = CType(mNextClipBoardViewerHWnd, IntPtr) Then mNextClipBoardViewerHWnd = m.LParam Else SendMessage(mNextClipBoardViewerHWnd, m.Msg, m.WParam, m.LParam) End If End Select MyBase.WndProc(m) End Sub#End Region Private Sub clipboardMon_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load NewViewer() End Sub '------------------監視剪下板資料代碼結束------------------ ''' <summary> ''' 點擊簽字地區時自動運行蒙恬即寫通程式 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click '定位蒙恬即寫通程式的位置路徑 Dim writePath As String = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86) + "\PenPower Write2Go\Bin\PPStartupApp.exe" Process.Start(writePath) End Sub ''' <summary> ''' 儲存當前picturebox中的圖片到資料庫 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim ms As New MemoryStream() Dim bReturn() As Byte = Nothing Me.PictureBox1.Image.Save(ms, Imaging.ImageFormat.Jpeg) bReturn = ms.GetBuffer ms.Close() Using conn As New SqlConnection(My.Settings.piaojuConnectionString) conn.Open() Dim cmd As New SqlClient.SqlCommand() cmd.Connection = conn cmd.CommandText = "insert into paper_baozhangshenpidan(paperID,applySign) values('20160227',@img)" Dim par As New SqlClient.SqlParameter("@img", SqlDbType.Image) par.Value = bReturn cmd.Parameters.Add(par) Dim t As Integer = Integer.Parse(cmd.ExecuteNonQuery()) If t > 0 Then MsgBox("Success") Else MsgBox("Faile") End If conn.Close() End Using End Sub ''' <summary> ''' 從資料庫中讀取image類型資料並顯示在picturebox控制項裡 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim imgData(0) As Byte Using conn As New SqlConnection(My.Settings.piaojuConnectionString) conn.Open() Dim cmd As New SqlCommand cmd.Connection = conn cmd.CommandText = "select * from paper_baozhangshenpidan where paperID='20160227'" Dim sdr As SqlDataReader = cmd.ExecuteReader sdr.Read() imgData = sdr("applySign") Dim mystream As New MemoryStream(imgData) Dim img As Image = Image.FromStream(mystream, True) Me.PictureBox1.Image = img Me.PictureBox1.Refresh() mystream.Close() conn.Close() End Using End SubEnd Class
備忘說明一下:
資料庫中列'applySign'的資料類型為image,用來存放圖片的byte資料